'''
@Description: 天眼查关键词爬取风险信息
@Author: bessie_lina
@Date: 2019-08-14 17:39:30
@LastEditTime: 2019-08-30 16:32:13
@LastEditors: Please set LastEditors
'''
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd'''
@description: 天眼查爬虫主类
@param
@return:
'''
class Tianyancha:# 常量定义url = 'https://www.tianyancha.com/login'def __init__(self, username, password, headless=False):self.username = usernameself.password = passwordself.headless = headless#填写信息self.driver = self.login(text_login='请输入11位手机号码', text_password='请输入登录密码')# 登录天眼查 donedef login(self, text_login, text_password):time_start = time.time()# 操作行为提示print ('在自动输入完用户名和密码前,请勿操作鼠标键盘!请保持优雅勿频繁(间隔小于1分钟)登录以减轻服务器负载。')#chromedriver="D:\Downloads\chromedriver_win32\chromedriver.exe"#driver = webdriver.Chrome(executable_path=chromedriver)driver = webdriver.Firefox()# 强制声明浏览器长宽为1024*768以适配所有屏幕driver.set_window_position(0, 0)driver.set_window_size(1024, 768)driver.get(self.url)# 模拟登陆:Selenium Locating Elements by Xpathtime.sleep(2)# 关闭底栏#driver.find_element_by_xpath("//img[@id='tyc_banner_close']").click()driver.find_element_by_xpath("//div[@tyc-event-ch='Login.PasswordLogin']").click()# 天眼查官方会频繁变化登录框的占位符,所以设置两个新参数来定义占位符#driver.find_elements_by_xpath("//input[@placeholder='{}']".format(text_login))[-2].send_keys(self.username)#driver.find_elements_by_xpath("//input[@placeholder='{}']".format(text_password))[-1].send_keys(self.password)# 手工登录,完成滑块验证码print ('请现在开始操作键盘鼠标,在15s内点击登录并手工完成滑块验证码。批量爬取只需一次登录。')time.sleep(10)print ('还剩5秒。')time.sleep(5)#等待页面加载出现WebDriverWait(driver,600000).until(EC.presence_of_element_located((By.ID,'home-main-search')))time_end = time.time()print('您的本次登录共用时{}秒。'.format(int(time_end - time_start)))return driverdef tianyancha_scrapy(self,keyword,table="all",change_page_interval=2,export='xlsx',quit_driver=True):"""爬虫主程序keyword:关键词change_page_interval 翻页时的休眠时间"""#公司搜索 donedef search_company(driver,url1):driver.get(url1)#加载页面content=driver.page_source.encode('utf-8')soup1 = BeautifulSoup(content, 'lxml')try:# TODO:'中信证券股份有限公司'无法正确检索try:url2 = soup1.find('div',class_='header').find('a', class_="name ").attrs['href']except:# url2 = driver.find_element_by_xpath("//div[@class='web-content']/div[@class='header']/a[@class='name ']").get_attribute('href')url2=driver.find_element_by_xpath('//*[@id="web-content"]//div[@class="header"]//a[position()<2]').get_attribute('href')print('登陆成功。')except:print('登陆过于频繁,请1分钟后再次尝试。')# # TODO: 如果搜索有误,手工定义URL2地址。有无改善方案?driver.get(url2)return driver#正常的表格爬取数def get_table_info(table):tab=table.find_element_by_tag_name('table')df = pd.read_html('<table>' + tab.get_attribute('innerHTML') + '</table>')if isinstance(df, list):df = df[0]if '操作' in df.columns:df = df.drop(columns='操作')# TODO:加入更多标准的表格处理条件data-contentprint(df)return dfdef tryonclick(table): # table实质上是selenium WebElement# 测试是否有翻页## 把条件判断写进tryonclick中try:# 找到有翻页标记table.find_element_by_tag_name('ul')onclickflag = 1except Exception:print("没有翻页") ## 声明表格名称: name[x] +onclickflag = 0return onclickflagdef tryontap(table):# 测试是否有翻页try:# table.find_element_by_xpath("//div[contains(@class,'over-hide changeTabLine f14')]")table.find_element_by_xpath("//div[@class='company_pager pagination-warp']")ontapflag = 1except:print("没有时间切换页") ## 声明表格名称: name[x] +ontapflag = 0return ontapflagdef change_page(table, df, driver):# TODO:抽象化:频繁变换点# PageCount = table.find_element_by_class_name('company_pager').text #历史class_name(天眼查的反爬措施):'total'# PageCount = re.sub("\D", "", PageCount)  # 使用正则表达式取字符串中的数字 ;\D表示非数字的意思PageCount = len(table.find_elements_by_xpath(".//ul[@class='pagination']/li")) - 1for _ in range(int(PageCount) - 1):# TODO:抽象化:频繁变换点button = table.find_element_by_xpath(".//a[@class='num -next']") #历史class_name(天眼查的反爬措施):'pagination-next  ',''driver.execute_script("arguments[0].click();", button)####################################################################################time.sleep(change_page_interval) # 更新换页时间间隔,以应对反爬虫####################################################################################df2 = get_table_info(table) ## 应该可以更换不同的get_XXXX_infodf = df.append(df2)return df# TODO:完善change_tap函数。def scrapy(driver,table,quit_driver=quit_driver):if isinstance(table, str):list_table = []list_table.append(table)table = list_tabletime.sleep(1)js="var q=document.documentElement.scrollTop=100000"  driver.execute_script(js)   #执行滑至底部time.sleep(1)tables = driver.find_elements_by_xpath("//div[contains(@id,'_container_')]")c = '_container_'name = [0] * (len(tables) - 2)# 生成一个独一无二的十六位参数作为公司标记,一个公司对应一个,需要插入多个数据表id = keywordtable_dict = {}for x in range(len(tables)-2):name[x] = tables[x].get_attribute('id')name[x] = name[x].replace(c, '')  # 可以用这个名称去匹配数据库if ((name[x] in table) or (table == ['all'])):# 检查用print('正在爬取' + str(name[x]))df = get_table_info(tables[x])onclickflag = tryonclick(tables[x])ontapflag = tryontap(tables[x])# 判断此表格是否有翻页功能if onclickflag == 1:df = change_page(tables[x], df, driver)# if ontapflag == 1:#     df = change_tap(tables[x], df)table_dict[name[x]] = dfelse:passif quit_driver:driver.quit()return table_dict#表格格式def gen_excel(table_dict, keyword):with pd.ExcelWriter(keyword+'.xlsx') as writer:for sheet_name in table_dict:table_dict[sheet_name].to_excel(writer, sheet_name=sheet_name, index=None)#json格式# def gen_json(table_dict, keyword):#     list_dic = []#     for i in list(table_dict.keys()):#         list_dic.append((i, table_dict[i]))#     dic = OrderedDict(list_dic)#     list_json = WriterJson().odict_to_json(dic)#     WriterJson().write_json(json_list=list_json, file_name=keyword+'.json')time_start = time.time()#搜索链接url_search = 'http://www.tianyancha.com/search?key=%s&checkFrom=searchBox' % keywordself.driver = search_company(self.driver, url_search)table_dict=scrapy(self.driver,table)if export == 'xlsx':gen_excel(table_dict, keyword)# elif export == 'json':#     gen_json(table_dict, keyword)else:print("请选择正确的输出格式,支持'xlsx'和'json'。")time_end = time.time()print('您的本次爬取共用时{}秒。'.format(int(time_end - time_start)))return table_dict#批量处理def tianyancha_scrapy_batch(self,input_template='input.xlsx',change_page_interval=2,export='xlsx'):df_input=pd.read_excel(input_template,encoding='gb18030').dropna(axis=1,how='all') #删除缺失的值,维度为1,全部元素(all)为空值才删除list_dicts=[]#逐个处理输入信息print(len(df_input.columns)-2)for i in range(len(df_input)):keyword=df_input['公司名称'].iloc[i]tables=[]#读取表格的位置[表名]for j in range(len(df_input.columns)-2):if not pd.isna(df_input.iloc[i,j+2]):tables.append(df_input.iloc[i,j+2])table_dict=self.tianyancha_scrapy(keyword=keyword,table=tables,change_page_interval=change_page_interval,export=export, quit_driver=False)list_dicts.append(table_dict)self.driver.quit()return tuple(list_dicts)'''
@description: 运行
'''
if __name__ == "__main__":#单个调用# list_match=['announcementcourt','lawsuit','court','zhixing','dishonest','courtRegister' ,\#             'abnormal','punish','equity','equityPledgeRatio','equityPledgeDetail','judicialSale',\#             'publicnoticeItem','environmentalPenalties','pastEquityCount','judicialAid']# ty=Tianyancha(username='username',password='password').tianyancha_scrapy(keyword='广州地铁集团有限公司',table=list_match,export='xlsx')#批量写入tuple_dicts=Tianyancha(username='改成自己的账号',password='改成自己的密码').tianyancha_scrapy_batch(input_template='input.xlsx',change_page_interval=2,export='xlsx')

可以直接跑的
在同目录下建一个input.xlsx
格式如下

['公司名字','announcementcourt','lawsuit','court','zhixing','dishonest','courtRegister','abnormal','punish','equity','equityPledgeRatio','equityPledgeDetail','judicialSale','publicnoticeItem','environmentalPenalties','pastEquityCount','judicialAid']

爬取天眼查 的python 代码相关推荐

  1. Python自动化爬取天眼查数据

    首先要注册一个账号密码,通过账号密码登录,并且滑块验证,自动输入搜索关键词,进行跳转翻页爬取数据,并保存到Excel文件中. 代码运行时,滑块验证经常不通过,被吃掉,但是发现打包成exe运行没有这个问 ...

  2. 记录一次利用python调用chrome爬取天眼查网址工商信息的过程

    1.首先准备工作: 1.pyhton3.6(官网有下载).https://www.python.org/downloads/release/python-363/ 2.pycharm 2017 开发工 ...

  3. python爬取天眼查存入excel表格_爬虫案例1——爬取新乡一中官网2018届高考录取名单...

    有一种非常常见并且相对简单的网络爬虫,工作流程大概是这样的: 访问目标网页 提取目标网页内表格信息 写入excel文件并保存 初次实践,我决定尝试写一个这样的爬虫.经过一番构思,我准备把爬取新乡一中官 ...

  4. python分支机构_基于Python爬取天眼查网站的企业信息!Python无所不能!

    注:这是一个在未登录的情况下,根据企业名称搜索,爬取企业页面数据的采集程序,是一个比较简单的爬虫,基本上只用到了代理,没有用到其他的反反爬技术,不过由于爬取的数据比较多, 适合刷解析技能的熟练度 . ...

  5. python爬取图解_20行PYTHON代码爬取微博高清大图,小白练手绝佳案例

    0. 前戏说明 环境说明 python3版本 所需库:Beautifulsoup .re .requests 知识点:正则表达式.基本网页请求与解析.文件写入 适用人群:小白 最终目标:20行代码爬取 ...

  6. python爬取天眼查数据(未破解图片验证及ajax版)

    import time import requests from bs4 import BeautifulSoup import lxml import json import copy import ...

  7. python应用:selenium之爬取天眼查信息

    inform_table.py 1 # -*-coding:utf8-*- 2 3 from selenium import webdriver 4 from selenium.webdriver.c ...

  8. python代码示例下载-python爬取音频下载的示例代码

    抓取"xmly"鬼故事音频 import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块 import requests headers = { & ...

  9. 使用python程序抓取天眼查,企查查和爱企查上的企业基本信息

    本文说明使用python程序自动抓取天眼查或者企查查上的企业基本信息.本文中的程序仅供学习参考,请通过正规渠道获取相应的数据资产. 工程目录如下: w3目录下内容为: 工程中的部分源码如下. 文件pa ...

最新文章

  1. CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
  2. 使用叶神模拟器无法访问本机服务器的问题(报错:java.net.ConnectException: failed to connect to /127.0.0.1 (port 5000) )
  3. Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造
  4. 根据选择计算Mask值
  5. 【转】MyEclipse快捷键大全(绝对全)
  6. openwrt patch文件怎么用_openwrt 打补丁方式修改内核源码
  7. 【报告分享】2021年95后医美人群洞察报告:颜值经济,95后“美力”来袭.pdf(附下载链接)...
  8. spring in action2笔记 第一章
  9. SPSS-Modeler安装
  10. 【AIQ合集】人工智能技术学习资料年度整理大合集电子书 PDF下载
  11. 2021年低压电工模拟考试题库及低压电工作业考试题库
  12. 写九宫格日记模块设计
  13. requests下载多张图片
  14. ARTS-24 字符串互异
  15. android4能用otg吗,小米4支持OTG吗?小米4手机的OTG功能怎么用?
  16. 树莓派安装系统和系统备份还原
  17. 在电脑上构建自我意识
  18. 19上海网络赛 Light bulbs (差分)
  19. 打单词游戏 html5,html打字游戏
  20. 池州计算机一级考试试题题库,池州科目一考试题库

热门文章

  1. Linux使用退格键时出现 H 解决方法,Linux使用退格键时出现^H解决方法
  2. JAVA微商城_O2O微门店SAAS系统
  3. web自动化测试-第一讲:selenium快速入门
  4. acedGrRead用法
  5. vue实现抽奖大转盘
  6. FreeRTOS 遇坑(1)
  7. 网络是怎样连接的学习笔记——从网线到网络设备
  8. Vue详细介绍及使用
  9. # 互联网相关职位--英文名词缩写及解释
  10. 区块链技术与支付_区块链技术将如何确保在线支付