企查查python爬虫实例
企查查python爬⾍实例
企查查python爬⾍实例
前些⽇⼦尝试给朋友写了⼀个查询⼤批公司的统⼀社会信⽤码的爬⾍程序,借助了很多⽹上的帖⼦,学习很多,现在也分享⼀下我⽤的python程序。
1. 准备python库⽂件(python 3.7)
import importlib #提供import语句
import sys
import time #提供延时功能
import xlrd #excel⽂件读取
import os
import xlwt #excel⽂件写⼊
py import copy #excel⽂件复制
from selenium import webdriver #浏览器操作库
2. ⾸先伪装成浏览器访问企查查⽹页,然后要⼿动登录⼀次,如果不登录不能查询企业的所有信息,⽽且限制查询次数。⼀开始尝试利
⽤程序⾃动完成账号密码登录,可是登录界⾯的进度条始终出错,后来利⽤第三⽅QQ登录便解决了这⼀步,也只需要点击两次,最好把QQ在电脑上登录好,会⾃动检测登录的QQ账户,点击两次就⾏了。这样就不⽤⼿机扫码了。另外登录后会有个提⽰绑定的弹出框,关掉就好。
这部分代码:
#伪装成浏览器,防⽌被识破
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)
#打开登录页⾯
<('www.qichacha/user_login')
注册公司的流程time.sleep(20)#等待20s,完成⼿动登录操作
#⼿动登录操作
3. 接下来我们会读取excel⾥⾯需要查询的公司列表,然后存⼊⼀个list⾥⾯,⽅便后⾯循环检索。
#从excel获取查询检索公司数据
worksheet = xlrd.open_workbook(u'test.xls')#excel放在同⼀个⼯作空间下
sheet1 = worksheet.sheet_by_name("CD类未拓展客户清单")#excel有多个sheet,检索该名字的sheet表格
rows = ws # 获取⾏数
inc_list =[]
for i in range(1,rows):
data = ll_value(i,1)# 取第2列公司数据
inc_list.append(data)
print(inc_list)#打印出来可检查获取的数据对不对
inc_len =len(inc_list)
4. 然后就开始检索公司,这⾥有两个思路,1)将inc_list ⾥⾯的公司全部检索出来存在另⼀个data_list⾥⾯,最后在写回excel⽂件
⾥;2)每检索⼀个公司就存回excel⽂件⾥并保存⽂件,然后再检索下⼀个再保存。显然第⼀个从程序上看效率更⾼,不⽤重复写⼊保存。但是在查询⼤量公司的情况下,⼀旦出现问题,之前查询的结果就没了,⼜得解决问题重新开始,这样效率反⽽会更低。所以我采⽤了第⼆种办法,虽然效率低点,但是我要查询⼏千个公司的数据,万⼀中途出现问题,不⽤从头开始。
我采⽤了第⼆种办法,虽然效率低点,但是我要查询⼏千个公司的数据,万⼀中途出现问题,不⽤从头开始。
#写回数据
writesheet1 = copy(worksheet)# 这⾥复制了⼀个excel,没有直接写回最初的⽂件。
writesheet2 = _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]#循环获取list⾥⾯的公司名称
time.sleep(1)#等待加载
……
5. 程序模仿浏览器进⾏检索公司中,会先搜索该公司,然后会检索到很多相关的企业,⼀般检索出来的相关列表第⼀个就是需要的公
司,这⾥需要程序模拟⼈⼯的点击。
该部分代码:
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:
#清楚搜索框内容
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()
这⾥利⽤了Xpath路径获取页⾯数据或者按钮的位置,在我们所要查询的数据或者按钮⽅框那⾥右击-检查就会进⼊⽹页的html界⾯,并会直接标出我们查询的位置对应的html代码,然后在代码处右击-copy-xpath,就可将该位置的路径复制到剪贴板上,后⾯获取数据也是利⽤这个办法。
6. 接着进⼊了公司信息界⾯,到我们需要的数据,同样利⽤上⾯的⽅法便可以获取数据对应的xpath路径,然后⽤指令获取这路径上的
数据就可以了。
可实际操作我利⽤基本信息⾥⾯的统⼀社会信⽤码的xpath路径总是获取的数据为空,从⽹上了解应该是这个地⽅利⽤了ajax的技术将数据存放在另⼀个url地址,可以在network⾥⾯到该地址,⽆奈我没有到这个url地址,但是我发现从上图标出的企业发展⾥⾯可以从统⼀社会信⽤码对应的xpath路径获取数据,便就在程序中多操作⼀步进⼊到企业发展界⾯⾥⾯,这⾥⾯的年报数据⾥⾯包含了信⽤码。不好的地⽅就是有的公司没有最近年份的年报数据,便也检索不到相关信息了,就必须要检测其余年份的年报数据,就还需要增加⼏个判断语句。我这⾥就直接检索最近年份的数据,如果检索不到就置none
该部分代码:
try:
# 获取⽹页地址,进⼊
inner=driver.find_element_by_xpath('//*[@id="search-result"]/tr[1]/td[3]/a').get_attribute("href")
<(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:
pass
try:
# 转到企业发展
tag = driver.find_element_by_xpath('//*[@id="report_title"]')
tag.click()
time.sleep(2)
#获取⾸个企业信⽤码
try:
credit_code= driver.find_element_by_xpath('//*[@id="0"]/table[1]/tbody/tr[1]/td[4]').text
except:
credit_code='none'
except:
credit_code ='none'
except:
credit_code ='none'
这⾥添加了很多try,excep 判断语句,主要是为了排除可能出现的错误以及⾃动关闭弹出框,让程序可是正常运⾏下去。流程图如下:
7. 将获取的数据存⼊excel对应的位置,并保存,开始下⼀次检索。
print(credit_code)
writesheet2.write(i+1,15, credit_code)# 将数据写⼊第16列
writesheet1.save(u'test2.xls')
driver.close()#关闭浏览器
⾄此,这个简易的爬⾍程序就写完了。总的来说,这种爬⾍程序采⽤的selenium库对于我这样的新⼿来说⽐较友好,就是总的效率不是很⾼,⽽且访问频率⾼了,也会被企查查给识别到,不过过⼀会再运⾏⼀下就⾏了,⽽且也不⽤从头来,之前的数据也都保存了。
实测第⼀次检测了1516个公司没有被中⽌,紧接著第⼆次检测的时候在900多次的时候被中⽌。⽹上也有很多利⽤Beautiful Soup,requests等库来做的,有机会也要再去尝试学习。另外说明的就是搜索的公司名称最好要完整,不要带地址啥的,这样可以提⾼检索到的概率,当然也有很多个体经营户是没有许多信息的,⾃然是检索不到。
谢谢浏览!也欢迎转载!最后附上完整代码:
import importlib #提供import语句
import sys
import time #提供延时功能
import xlrd #excel⽂件读取
import os
import xlwt #excel⽂件写⼊
py import copy #excel⽂件复制
from selenium import webdriver #浏览器操作库
#伪装成浏览器,防⽌被识破
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)
#打开登录页⾯
<('www.qichacha/user_login')
time.sleep(20)#等待20s,完成⼿动登录操作
# ⼿动登录操作
#从excel获取查询单位
worksheet = xlrd.open_workbook(u'test.xls')
sheet1 = worksheet.sheet_by_name("CD类未拓展客户清单")#excel有多个sheet,检索该名字的sheet表格
rows = ws # 获取⾏数
inc_list =[]
for i in range(1,rows):
data = ll_value(i,1)# 取第2列数据
data = ll_value(i,1)# 取第2列数据
inc_list.append(data)
print(inc_list)
inc_len =len(inc_list)
#写回数据
writesheet1 = copy(worksheet)# 这⾥复制了⼀个excel,没有直接写回最初的⽂件。
writesheet2 = _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:
#清楚搜索框内容
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:
# 获取⽹页地址,进⼊
inner = driver.find_element_by_xpath('//*[@id="search-result"]/tr[1]/td[3]/a').get_attribute("href")        (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:
pass
try:
# 转到企业发展
tag = driver.find_element_by_xpath('//*[@id="report_title"]')
tag.click()
time.sleep(2)
#获取⾸个企业信⽤码
try:
credit_code = driver.find_element_by_xpath('//*[@id="0"]/table[1]/tbody/tr[1]/td[4]').text except:
credit_code='none'
except:
credit_code ='none'
except:
credit_code ='none'
print(credit_code)
writesheet2.write(i+1,15, credit_code)# 第16列数据sheet1.write(i, j, data[j])
writesheet1.save(u'test2.xls')
driver.close()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。