python根据单位名称爬取单位统⼀社会信⽤代码
前两天,刘先⽣跟我提了这样⼀个需求:我有⼀个excel表格,⾥⾯包含了⼀些单位名称,我需要获取它们对应的18位“统⼀社会信⽤代码”。由于单位数量较多,⼀个⼀个去企查查、天眼查或者统⼀社会信⽤代码官⽹查询⽐较耗时,⽽且都是重复性劳动耗着⼀个⼈不划算。刚好我会爬⾍,就想写⼀段代码来⽤机器代替⼈⼯完成这个任务。
写爬⾍之前先选择⼯具,我这⾥使⽤的是Selenium。Selenium是⼀个Web的⾃动化测试⼯具,最初是为⽹站⾃动化测试⽽开发的,类型像我们玩游戏⽤的按键精灵,可以按指定的命令⾃动操作,不同是Selenium 可以直接运⾏在浏览器上,它⽀持所有主流的浏览器(包括PhantomJS这些⽆界⾯的浏览器)。Selenium 可以根据我们的指令,让浏览器⾃动加载页⾯,获取需要的数据,甚⾄页⾯截屏,或者判断⽹站上某些动作是否发⽣。Selenium ⾃⼰不带浏览器,不⽀持浏览器的功能,它需要与第三⽅浏览器结合在⼀起才能使⽤。本⽂中浏览器使⽤的是Chrome,所以需要提前下载安装ChromeDriver。下载地址:leapis/index.html 。需要根据⾃⼰的浏览器版本下载对应的ChromeDriver。将下载好的⽂件解压,然后放到你使⽤的python解释器相同的⽬录下即可。
在经过反复调试后我的代码完成了。代码分为4个部分,分别为程序主⼊⼝,读取excel、结果写⼊excel和爬⾍。
⾸先看⼀下读取excel部分
def get_excel_data(sheetName, row, col=0):
'''
从excel中读取data
:param sheetName: ⼯作表名称
:param row: ⾏号
:param col: 列号,默认取第0列
:return: ⼯作表sheetName的第row⾏col列的值
'''
excelDir ='./data/单位名称.xls'
# 创建⼯作薄
workBook = xlrd.open_workbook(excelDir)
# 选择⼯作表
workSheet = workBook.sheet_by_name(sheetName)
ll(row, col).value
需要说明2点:
2.“./data/单位名称.xls”是在当前⽬录下有个data⽂件夹,⾥⾯放置的是要读取的excel⽂件
其次,结果写⼊
def set_excel_data():
'''
将获取到的数据写⼊到excel
:
return: 新的⼯作薄和新的⼯作表
'''
excelDir ='./data/单位名称.xls'
workBook = xlrd.open_workbook(excelDir)
newWorkBook = copy(workBook)
newSheet = _sheet(0)
return newWorkBook, newSheet
前两⾏与前⾯的⽅法重复,其实可以提取出来,有兴趣的可以⾃⾏提取。
接着就是最重要的爬⾍部分了
"""
从百度信⽤上爬取单位名称所对应的18位统⼀社会信⽤代码
:
param data: 要爬的单位名称
:return: 爬到的单位名称和社会信⽤代码
"""
url ='xin.baidu/'
<(url)# 发送请求
driver.find_element_by_id("aqc-search-input").send_keys(data)# 输⼊要搜索的内容
driver.find_element_by_class_name("search-btn").click()# 点击搜索按钮
sleep(3)# 休眠3秒,为保证页⾯数据加载完成
# xpath 提取⽹页信息
html = etree.HTML(driver.page_source)
name_cache = html.xpath(".//div[@class='wrap']/div[1]//h3/a/@title")
print(name_cache)
if name_cache:
name_cache = name_cache[0]
if name_cache != data:# 如果查询到的单位名称与查询的单位名称不符,只直接返回
return
p = html.xpath(".//div[@class='wrap']/div[1]//h3/a/@href")[0]# 获取查询出来的第⼀条数据(完全匹配的单位名称)的url地址
new_url = f'xin.baidu{p}'# 构建新的url请求
<(new_url)
new_html = etree.HTML(driver.page_source)
name = new_html.xpath(".//h2/text()")[0]# 单位名称
code = new_html.xpath(".//table[@class='zx-detail-basic-table']/tbody/tr[4]/td[2]/text()")[0]# 社会信⽤代码
return name, code
这⾥使⽤ XPath 对于获取到的页⾯信息进⾏提取。XPath 是⼀门在 XML ⽂档中查信息的语⾔。XPath 可⽤来在 XML ⽂档中对元素和属性进⾏遍历。
最后是程序主⼊⼝
if __name__ =='__main__':
# 构造浏览器
driver = webdriver.Chrome()
# 创建写⼊的⼯作薄和⼯作表对象
workBook, sheet = set_excel_data()python解释器下载
for row in range(1,5):#这⾥的1代表从第1⾏开始,到第5⾏结束(不包括第5⾏)具体数值有实际情况
决定,这⾥只做测试⽤。
data = get_excel_data('Sheet1', row)
# 执⾏爬⾍
name, code =(spider(data)if spider(data)else('null','null'))
# 结果断⾔
if code !='null':
print('---成功---')
# 写⼊结果
sheet.write(row,1, name)
sheet.write(row,2, code)
else:
print('---null---')
# 写⼊结果
sheet.write(row,1,'null')
sheet.write(row,2,'null')
# 关闭浏览器
driver.quit()
# 保存⼯作薄
workBook.save('./查询结果.xls')
如果想要保留excel样式的话需要在 “ xlrd.open_workbook(excelDir)”中添加 “formatting_info=True ”字段,默认是 “False”。但是我们会发现在读取xlsx格式的Excel时,传⼊“formatting_info=True ”会直接抛出异常,抛异常的原因是“formatting_info=True ”还没有对新版本的xlsx的格式完成兼容。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论