企查查python爬虫实例
企查查python爬蟲實例
前些日子嘗試給朋友寫了一個查詢大批公司的統(tǒng)一社會信用碼的爬蟲程序,借助了很多網(wǎng)上的帖子,學習很多,現(xiàn)在也分享一下我用的python程序。
準備python庫文件(python 3.7)
import importlib #提供import語句 import sys import time #提供延時功能 import xlrd #excel文件讀取 import os import xlwt #excel文件寫入 from xlutils.copy import copy #excel文件復制 from selenium import webdriver #瀏覽器操作庫 importlib.reload(sys)首先偽裝成瀏覽器訪問企查查網(wǎng)頁,然后要手動登錄一次,如果不登錄不能查詢企業(yè)的所有信息,而且限制查詢次數(shù)。一開始嘗試利用程序自動完成賬號密碼登錄,可是登錄界面的進度條始終出錯,后來利用第三方QQ登錄便解決了這一步,也只需要點擊兩次,最好把QQ在電腦上登錄好,會自動檢測登錄的QQ賬戶,點擊兩次就行了。這樣就不用手機掃碼了。另外登錄后會有個提示綁定微信的彈出框,關(guān)掉就好。
這部分代碼:
接下來我們會讀取excel里面需要查詢的公司列表,然后存入一個list里面,方便后面循環(huán)檢索。
#從excel獲取查詢檢索公司數(shù)據(jù) worksheet = xlrd.open_workbook(u'test.xls')#excel放在同一個工作空間下 sheet1 = worksheet.sheet_by_name("CD類未拓展客戶清單")#excel有多個sheet,檢索該名字的sheet表格 rows = sheet1.nrows # 獲取行數(shù) inc_list = [] for i in range(1,rows) :data = sheet1.cell_value(i, 1) # 取第2列公司數(shù)據(jù)inc_list.append(data) print(inc_list) #打印出來可檢查獲取的數(shù)據(jù)對不對 inc_len = len(inc_list)然后就開始檢索公司,這里有兩個思路,1)將inc_list 里面的公司全部檢索出來存在另一個data_list里面,最后在寫回excel文件里;2)每檢索一個公司就存回excel文件里并保存文件,然后再檢索下一個再保存。顯然第一個從程序上看效率更高,不用重復寫入保存。但是在查詢大量公司的情況下,一旦出現(xiàn)問題,之前查詢的結(jié)果就沒了,又得解決問題重新開始,這樣效率反而會更低。所以我采用了第二種辦法,雖然效率低點,但是我要查詢幾千個公司的數(shù)據(jù),萬一中途出現(xiàn)問題,不用從頭開始。
#寫回數(shù)據(jù) writesheet1 = copy(worksheet)# 這里復制了一個excel,沒有直接寫回最初的文件。 writesheet2 = writesheet1.get_sheet(1)#同樣獲得第一個sheet style = xlwt.easyxf('font:height 240, color-index red, bold on;align: wrap on, vert centre, horiz center'); #開啟爬蟲 for i in range(inc_len):txt = inc_list[i] #循環(huán)獲取list里面的公司名稱time.sleep(1) #等待加載……程序模仿瀏覽器進行檢索公司中,會先搜索該公司,然后會檢索到很多相關(guān)的企業(yè),一般檢索出來的相關(guān)列表第一個就是需要的公司,這里需要程序模擬人工的點擊。
該部分代碼:
這里利用了Xpath路徑獲取頁面數(shù)據(jù)或者按鈕的位置,在我們所要查詢的數(shù)據(jù)或者按鈕方框那里右擊-檢查就會進入網(wǎng)頁的html界面,并會直接標出我們查詢的位置對應的html代碼,然后在代碼處右擊-copy-xpath,就可將該位置的路徑復制到剪貼板上,后面獲取數(shù)據(jù)也是利用這個辦法。
接著進入了公司信息界面,找到我們需要的數(shù)據(jù),同樣利用上面的方法便可以獲取數(shù)據(jù)對應的xpath路徑,然后用指令獲取這路徑上的數(shù)據(jù)就可以了。
可實際操作我利用基本信息里面的統(tǒng)一社會信用碼的xpath路徑總是獲取的數(shù)據(jù)為空,從網(wǎng)上了解應該是這個地方利用了ajax的技術(shù)將數(shù)據(jù)存放在另一個url地址,可以在network里面找到該地址,無奈我沒有找到這個url地址,但是我發(fā)現(xiàn)從上圖標出的企業(yè)發(fā)展里面可以從統(tǒng)一社會信用碼對應的xpath路徑獲取數(shù)據(jù),便就在程序中多操作一步進入到企業(yè)發(fā)展界面里面,這里面的年報數(shù)據(jù)里面包含了信用碼。不好的地方就是有的公司沒有最近年份的年報數(shù)據(jù),便也檢索不到相關(guān)信息了,就必須要檢測其余年份的年報數(shù)據(jù),就還需要增加幾個判斷語句。我這里就直接檢索最近年份的數(shù)據(jù),如果檢索不到就置none
該部分代碼:
這里添加了很多try,excep 判斷語句,主要是為了排除可能出現(xiàn)的錯誤以及自動關(guān)閉彈出框,讓程序可是正常運行下去。流程圖如下:
將獲取的數(shù)據(jù)存入excel對應的位置,并保存,開始下一次檢索。
print(credit_code)writesheet2.write(i+1, 15, credit_code) # 將數(shù)據(jù)寫入第16列writesheet1.save(u'test2.xls') driver.close() #關(guān)閉瀏覽器至此,這個簡易的爬蟲程序就寫完了。總的來說,這種爬蟲程序采用的selenium庫對于我這樣的新手來說比較友好,就是總的效率不是很高,而且訪問頻率高了,也會被企查查給識別到,不過過一會再運行一下就行了,而且也不用從頭來,之前的數(shù)據(jù)也都保存了。實測第一次檢測了1516個公司沒有被中止,緊接著第二次檢測的時候在900多次的時候被中止。網(wǎng)上也有很多利用Beautiful Soup,requests等庫來做的,有機會也要再去嘗試學習。另外說明的就是搜索的公司名稱最好要完整,不要帶地址啥的,這樣可以提高檢索到的概率,當然也有很多個體經(jīng)營戶是沒有許多信息的,自然是檢索不到。
謝謝瀏覽!也歡迎轉(zhuǎn)載!最后附上完整代碼:
import importlib #提供import語句 import sys import time #提供延時功能 import xlrd #excel文件讀取 import os import xlwt #excel文件寫入from xlutils.copy import copy #excel文件復制 from selenium import webdriver #瀏覽器操作庫importlib.reload(sys)#偽裝成瀏覽器,防止被識破 option = webdriver.ChromeOptions() option.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"') driver = webdriver.Chrome(options=option)#打開登錄頁面 driver.get('https://www.qichacha.com/user_login') time.sleep(20)#等待20s,完成手動登錄操作 # 手動登錄操作#從excel獲取查詢單位 worksheet = xlrd.open_workbook(u'test.xls') sheet1 = worksheet.sheet_by_name("CD類未拓展客戶清單")#excel有多個sheet,檢索該名字的sheet表格 rows = sheet1.nrows # 獲取行數(shù) inc_list = [] for i in range(1,rows) :data = sheet1.cell_value(i, 1) # 取第2列數(shù)據(jù)inc_list.append(data) print(inc_list) inc_len = len(inc_list)#寫回數(shù)據(jù) writesheet1 = copy(worksheet)# 這里復制了一個excel,沒有直接寫回最初的文件。 writesheet2 = writesheet1.get_sheet(1)#同樣獲得第一個sheet style = xlwt.easyxf('font:height 240, color-index red, bold on;align: wrap on, vert centre, horiz center');#開啟爬蟲 for i in range(inc_len):txt = inc_list[i]time.sleep(1)if (i==0):#向搜索框注入文字driver.find_element_by_id('searchkey').send_keys(txt)#單擊搜索按鈕srh_btn = driver.find_element_by_xpath('//*[@id="indexSearchForm"]/div/span/input')srh_btn.click()else:#清楚搜索框內(nèi)容driver.find_element_by_id('headerKey').clear()# 向搜索框注入下一個公司地址driver.find_element_by_id('headerKey').send_keys(txt)#搜索按鈕srh_btn = driver.find_element_by_xpath('/html/body/header/div/form/div/div/span/button')srh_btn.click()try:# 獲取網(wǎng)頁地址,進入inner = driver.find_element_by_xpath('//*[@id="search-result"]/tr[1]/td[3]/a').get_attribute("href")driver.get(inner)time.sleep(2)# 彈出框按鈕try:try:srh_btn = driver.find_element_by_xpath('//*[@id="firstepdadModal"]/div/div/div[2]/button')srh_btn.click()except:srh_btn = driver.find_element_by_xpath('//*[@id="firstcaseModal"]/div/div/div[2]/button')srh_btn.click()except:passtry:# 轉(zhuǎn)到企業(yè)發(fā)展tag = driver.find_element_by_xpath('//*[@id="report_title"]')tag.click()time.sleep(2)#獲取首個企業(yè)信用碼try:credit_code = driver.find_element_by_xpath('//*[@id="0"]/table[1]/tbody/tr[1]/td[4]').textexcept:credit_code='none'except:credit_code = 'none'except:credit_code = 'none'print(credit_code)writesheet2.write(i+1, 15, credit_code) # 第16列數(shù)據(jù)sheet1.write(i, j, data[j])writesheet1.save(u'test2.xls')driver.close()總結(jié)
以上是生活随笔為你收集整理的企查查python爬虫实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThreadLocal和线程同步机制的对
- 下一篇: linux内核编程踩坑