企查查python爬虫实例
企查查python爬蟲實(shí)例
前些日子嘗試給朋友寫了一個(gè)查詢大批公司的統(tǒng)一社會(huì)信用碼的爬蟲程序,借助了很多網(wǎng)上的帖子,學(xué)習(xí)很多,現(xiàn)在也分享一下我用的python程序。
準(zhǔn)備python庫(kù)文件(python 3.7)
import importlib #提供import語句 import sys import time #提供延時(shí)功能 import xlrd #excel文件讀取 import os import xlwt #excel文件寫入 from xlutils.copy import copy #excel文件復(fù)制 from selenium import webdriver #瀏覽器操作庫(kù) importlib.reload(sys)首先偽裝成瀏覽器訪問企查查網(wǎng)頁,然后要手動(dòng)登錄一次,如果不登錄不能查詢企業(yè)的所有信息,而且限制查詢次數(shù)。一開始嘗試?yán)贸绦蜃詣?dòng)完成賬號(hào)密碼登錄,可是登錄界面的進(jìn)度條始終出錯(cuò),后來利用第三方QQ登錄便解決了這一步,也只需要點(diǎn)擊兩次,最好把QQ在電腦上登錄好,會(huì)自動(dòng)檢測(cè)登錄的QQ賬戶,點(diǎn)擊兩次就行了。這樣就不用手機(jī)掃碼了。另外登錄后會(huì)有個(gè)提示綁定微信的彈出框,關(guān)掉就好。
這部分代碼:
接下來我們會(huì)讀取excel里面需要查詢的公司列表,然后存入一個(gè)list里面,方便后面循環(huán)檢索。
#從excel獲取查詢檢索公司數(shù)據(jù) worksheet = xlrd.open_workbook(u'test.xls')#excel放在同一個(gè)工作空間下 sheet1 = worksheet.sheet_by_name("CD類未拓展客戶清單")#excel有多個(gè)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ù)對(duì)不對(duì) inc_len = len(inc_list)然后就開始檢索公司,這里有兩個(gè)思路,1)將inc_list 里面的公司全部檢索出來存在另一個(gè)data_list里面,最后在寫回excel文件里;2)每檢索一個(gè)公司就存回excel文件里并保存文件,然后再檢索下一個(gè)再保存。顯然第一個(gè)從程序上看效率更高,不用重復(fù)寫入保存。但是在查詢大量公司的情況下,一旦出現(xiàn)問題,之前查詢的結(jié)果就沒了,又得解決問題重新開始,這樣效率反而會(huì)更低。所以我采用了第二種辦法,雖然效率低點(diǎn),但是我要查詢幾千個(gè)公司的數(shù)據(jù),萬一中途出現(xiàn)問題,不用從頭開始。
#寫回?cái)?shù)據(jù) writesheet1 = copy(worksheet)# 這里復(fù)制了一個(gè)excel,沒有直接寫回最初的文件。 writesheet2 = writesheet1.get_sheet(1)#同樣獲得第一個(gè)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) #等待加載……程序模仿瀏覽器進(jìn)行檢索公司中,會(huì)先搜索該公司,然后會(huì)檢索到很多相關(guān)的企業(yè),一般檢索出來的相關(guān)列表第一個(gè)就是需要的公司,這里需要程序模擬人工的點(diǎn)擊。
該部分代碼:
這里利用了Xpath路徑獲取頁面數(shù)據(jù)或者按鈕的位置,在我們所要查詢的數(shù)據(jù)或者按鈕方框那里右擊-檢查就會(huì)進(jìn)入網(wǎng)頁的html界面,并會(huì)直接標(biāo)出我們查詢的位置對(duì)應(yīng)的html代碼,然后在代碼處右擊-copy-xpath,就可將該位置的路徑復(fù)制到剪貼板上,后面獲取數(shù)據(jù)也是利用這個(gè)辦法。
接著進(jìn)入了公司信息界面,找到我們需要的數(shù)據(jù),同樣利用上面的方法便可以獲取數(shù)據(jù)對(duì)應(yīng)的xpath路徑,然后用指令獲取這路徑上的數(shù)據(jù)就可以了。
可實(shí)際操作我利用基本信息里面的統(tǒng)一社會(huì)信用碼的xpath路徑總是獲取的數(shù)據(jù)為空,從網(wǎng)上了解應(yīng)該是這個(gè)地方利用了ajax的技術(shù)將數(shù)據(jù)存放在另一個(gè)url地址,可以在network里面找到該地址,無奈我沒有找到這個(gè)url地址,但是我發(fā)現(xiàn)從上圖標(biāo)出的企業(yè)發(fā)展里面可以從統(tǒng)一社會(huì)信用碼對(duì)應(yīng)的xpath路徑獲取數(shù)據(jù),便就在程序中多操作一步進(jìn)入到企業(yè)發(fā)展界面里面,這里面的年報(bào)數(shù)據(jù)里面包含了信用碼。不好的地方就是有的公司沒有最近年份的年報(bào)數(shù)據(jù),便也檢索不到相關(guān)信息了,就必須要檢測(cè)其余年份的年報(bào)數(shù)據(jù),就還需要增加幾個(gè)判斷語句。我這里就直接檢索最近年份的數(shù)據(jù),如果檢索不到就置none
該部分代碼:
這里添加了很多try,excep 判斷語句,主要是為了排除可能出現(xiàn)的錯(cuò)誤以及自動(dòng)關(guān)閉彈出框,讓程序可是正常運(yùn)行下去。流程圖如下:
將獲取的數(shù)據(jù)存入excel對(duì)應(yīng)的位置,并保存,開始下一次檢索。
print(credit_code)writesheet2.write(i+1, 15, credit_code) # 將數(shù)據(jù)寫入第16列writesheet1.save(u'test2.xls') driver.close() #關(guān)閉瀏覽器至此,這個(gè)簡(jiǎn)易的爬蟲程序就寫完了。總的來說,這種爬蟲程序采用的selenium庫(kù)對(duì)于我這樣的新手來說比較友好,就是總的效率不是很高,而且訪問頻率高了,也會(huì)被企查查給識(shí)別到,不過過一會(huì)再運(yùn)行一下就行了,而且也不用從頭來,之前的數(shù)據(jù)也都保存了。實(shí)測(cè)第一次檢測(cè)了1516個(gè)公司沒有被中止,緊接著第二次檢測(cè)的時(shí)候在900多次的時(shí)候被中止。網(wǎng)上也有很多利用Beautiful Soup,requests等庫(kù)來做的,有機(jī)會(huì)也要再去嘗試學(xué)習(xí)。另外說明的就是搜索的公司名稱最好要完整,不要帶地址啥的,這樣可以提高檢索到的概率,當(dāng)然也有很多個(gè)體經(jīng)營(yíng)戶是沒有許多信息的,自然是檢索不到。
謝謝瀏覽!也歡迎轉(zhuǎn)載!最后附上完整代碼:
import importlib #提供import語句 import sys import time #提供延時(shí)功能 import xlrd #excel文件讀取 import os import xlwt #excel文件寫入from xlutils.copy import copy #excel文件復(fù)制 from selenium import webdriver #瀏覽器操作庫(kù)importlib.reload(sys)#偽裝成瀏覽器,防止被識(shí)破 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,完成手動(dòng)登錄操作 # 手動(dòng)登錄操作#從excel獲取查詢單位 worksheet = xlrd.open_workbook(u'test.xls') sheet1 = worksheet.sheet_by_name("CD類未拓展客戶清單")#excel有多個(gè)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)#寫回?cái)?shù)據(jù) writesheet1 = copy(worksheet)# 這里復(fù)制了一個(gè)excel,沒有直接寫回最初的文件。 writesheet2 = writesheet1.get_sheet(1)#同樣獲得第一個(gè)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()# 向搜索框注入下一個(gè)公司地址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)頁地址,進(jìn)入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)#獲取首個(gè)企業(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爬虫实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThreadLocal和线程同步机制的对
- 下一篇: python图像化计算器