爬取天眼查 的python 代码

2023-11-13

'''
@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 = username
        self.password = password
        self.headless = headless
        #填写信息
        self.driver = self.login(text_login='请输入11位手机号码', text_password='请输入登录密码')

    # 登录天眼查 done
    def 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 Xpath
        time.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 driver

    def tianyancha_scrapy(self,
                        keyword,
                        table="all",
                        change_page_interval=2,
                        export='xlsx',
                        quit_driver=True):
        """
        爬虫主程序
        keyword:关键词
        change_page_interval 翻页时的休眠时间
        """
        #公司搜索 done
        def 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-content
            print(df)
            return df

        def tryonclick(table): # table实质上是selenium WebElement
            # 测试是否有翻页
            ## 把条件判断写进tryonclick中
            try:
                # 找到有翻页标记
                table.find_element_by_tag_name('ul')
                onclickflag = 1
            except Exception:
                print("没有翻页") ## 声明表格名称: name[x] +
                onclickflag = 0
            return onclickflag

        def 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 = 1
            except:
                print("没有时间切换页") ## 声明表格名称: name[x] +
                ontapflag = 0
            return ontapflag
        def 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")) - 1

            for _ 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_info
                df = 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_table

            time.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 = keyword
            table_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]] = df
                else:
                    pass
                    
            if 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' % keyword
        self.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']

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬取天眼查 的python 代码 的相关文章

  • 网格搜索多个监督学习模型上的超参数,包括神经网络、随机森林和树集合模型(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 我们在选择超参数有两个途径 1 凭经验 2 选择不同大小的参数 带入到模型中 挑选表现最好的参数 通过途径2选择超参数时 人力手动调节注意力成本太高 非常不值得 F
  • 什么是环境变量?为什么java要配置环境变量?

    本文是将https blog csdn net qq 37872792 article details 80642985 与 https blog csdn net Pre waist L article details 79696507两
  • 虚拟机打开防火墙端口相关指令

    本篇文章用于记录在虚拟机操作过程中对于查看防火墙状态 开启防火墙 关闭防火墙指令进行记录 查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 sy
  • 40 个 常用的 SpringBoot 注解,你知道几个?

    一 Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 RequestMapping RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射 Spring MVC
  • eNSP——VLAN配置实验

    目录 一 新建拓扑 二 配置LSW5 三 配置LSW6 一 新建拓扑 实现效果 PC10可以ping通PC12 ping不通PC11 PC13 二 配置LSW5 1 系统视图开启VLAN100 2 进入接口G0 0 1配置VLAN acce
  • signature=b05c505286f606b32d69ab58ee3e7bf4,reduce-css-calc/yarn.lock at 0f6c532cf9dc52ac3cb23e143eaf...

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 ava babel preset stage 4 1 0 0 version 1 1
  • 云计算之你必须知道的几个会议和杂志

    云计算现在被大家炒的热火朝天 那么很多人也想更多了解云计算 那么我就给大家介绍几个杂志和网站 IEEE International Conference on Cloud Computing http www thecloudcomputi
  • vue中的promise对象,async和await学习记录

    promise有待学习 先记录一下最近再项目中学的关于async和await async await 其实就是用同步的写法去实现异步方法 async deleteproduct record const result await produ
  • npm 配置淘宝镜像

    首先解释一下 npm 为什么要配置淘宝镜像 原因 因为node js 默认使用的是国外的网站 国内访问有一个跨国内局域网的操作 所以就会有时候很慢 这就跟为什么网站的静态资源有些会使用CDN 加速一样的 淘宝镜像是什么 就是npm 很多的插
  • hive转义问题详解

    hive转义问题详解 引言 hive控制台执行 字符串不包含 字符串包含 hive e的方式嵌入到shell脚本执行 字符串不包含 字符串包含 总结 引言 hive转义问题想必进来的同学都遇到过 这里就直奔主题了 此类问题大致可以分为两种常
  • Linux上快速安装软RAID详细步骤

    常见问题服务平台 2018 11 17 物理环境 虚拟机CentOS6 4 配置 8G内存 2 2核cpu 3块虚拟硬盘 sda sdb sdc sdb和sdc是完全一样的 在实际生产环境中 系统硬盘与数据库和应用是分开的 这样有利于系统的
  • HDRP

    HDRP 的 10 版本支持 Unity 2020 LTS 及以上 新版的 HDRP 软件包将继续优化用户友好的界面 灵活的功能 管线的稳定性和总体性能 但如果想将 HDRP 设置到最佳状态 你必须要了解所有主要的管线设置 及其背后的原理和
  • Oracle报错:IO Error: The Network Adapter could not establish the connection

    Caused by oracle net ns NetException The Network Adapter could not establish the connection at oracle net nt ConnStrateg
  • 深度学习框架Pytorch快速开发与实践

    决定用两个星期读完这本书 并自己用Pytorch搭建一个模型 2019 8 5 第一章深度学习介绍 明确学习目标 深度学习难点不是深度学习本身 难的是你要吃透问题 如何用深度学习的逻辑去思考你自己的问题 有针对性地设计模型 难的是你有分析问
  • 机器学习系列(7)_机器学习路线图(附资料)

    作者 龙心尘 寒小阳 时间 2016年2月 出处 http blog csdn net longxinchen ml article details 50749614 http blog csdn net han xiaoyang arti
  • epoll高度封装reactor,几乎所有可见服务器的底层框架

    目录 前言 reactor是什么 如何理解 reactor所需组件流程分析 组件 流程 如何将epoll的IO驱动封装成reactor事件反应堆驱动 reactor分块分析实现 注册事件处理器部分流程 多路复用器监视多路IO事件 事件分发器
  • 【React学习】React更新渲染原理

    当我们调用 setState 之后发生了什么 react经历了怎样的过程将新的 state 渲染到页面上 一次react更新 核心就是对虚拟dom进行diff 找出最少的需要变化的dom节点 然后对其进行相应的dom操作 用户即可在页面上看
  • MySQL数据导入--load data

    起因 朋友的数据库 用的版本是5 5 19 服务端和客户端字符集都是utf8 因为某些原因 系统经过好多人的开发和处理 同一个表存在多种字符集写入 so乱码问题 时有发生 为了彻底解决这个问题 我这边的操作如下 1 核查工程中转码的地方 2
  • Python初学者的一个常见错误

    大家都知道 列表是可变数据类型 而可变数据类型的操作尤其需要我们细心 不然很容易出错 来看看这个例子 list1 1 2 3 4 5 list2 list1 3 print list2 list1 2 b list2 1 1 a print
  • [从零开始学DeepFaceLab-8]: 使用-命令行八大操作步骤-第5步:从源图片中提取所需图片

    目录 总体流程 步骤5 从源视频中提取图片 5 1 命令 5 data dst faceset extract manual fix bat 不推荐使用

随机推荐

  • vue回车事件

    一 需求 需求 登录页面在输入密码后 按回车键 Enter 触发登录 二 实现 部分代码 重点事件 keyup enter native 指的是回车监听事件 举例 keyup enter native submitForm ruleForm
  • 贪心算法——排队打水问题

    6 3 排队打水问题 有n个人排队到r个水龙头去打水 他们装满水桶的时间为t1 t2 tn为正整数且个不相等 应如何安排他们打水顺序才能使他们花费的时间最少 算法分析 时间总和 等待时间 装水时间 采用贪心思想 先sort 默认将装水时间从
  • LeetCode-2335. 装满杯子需要的最短总时长【贪心,数学】

    LeetCode 2335 装满杯子需要的最短总时长 贪心 数学 题目描述 解题思路一 其实像一道数学题目 假设三个杯子x lt y lt z先分两种情况 第一种 x y lt z 答案直接是最大的z 第二种 x y gt z 先将x与y互
  • .NET6之MiniAPI(四):配置

    配置文件 是一个每个应用服务程序常用的功能 从原来的终端应用时代 到现在的元宇宙时代 配置都是很悠然自得的存在 asp net core提供了强大的配置文件访问机制 不管是MVC API还是MiniAPI 使用方式都是相同的 框架默认的配置
  • 初识 Redis - 分布式,内存数据存储,缓存

    目录 1 什么是 Redis 1 1 Redis 内存数据存储 1 2 Redis 用作数据库 1 3 Redis 用作缓存 cache 1 4 用作消息中间件 1 什么是 Redis The open source in memory d
  • 关于面试时的自我介绍口述(样版)

    前言 段落引用很多小伙伴都有过面试不知道说啥 一昧的做简单的自我介绍 如 我叫XXX 今年几岁 男 来自XXX 然后就不知道说啥了 甚至有的会说简历上有您直接看就是了 口述朗文 下面的1 2 3 4无需在口述中表达出来 简单的说就是别念出来
  • 右键菜单调用命令行

    新建文档 Windows Registry Editor Version 5 00 HKEY CLASSES ROOT Folder shell CmdPrompt cmd here HKEY CLASSES ROOT Folder she
  • DELL戴尔笔记本电脑灵越Inspiron 14 5410&5418原厂Win10系统恢复原装OEM出厂状态系统

    Dell戴尔笔记本电脑 灵越Inspiron 14 5410 5418原装出厂OEM系统镜像原厂系统文件 系统自带所有驱动 出厂主题壁纸LOGO Office办公软件等预装程序 链接 https pan baidu com s 1Qj dW
  • C++ 核心编程

    一 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 代码区 存放函数体的二进制代码 由操作系统进行管理 全局区 存放全局变量和静态变量以及常量 栈区 由编译器自动分配释放 存放函数的参数值 局部变量等 堆区 由程序员分配和释放
  • 基于STM32的ESP8266获取天气数据(HAL库)

    一 介绍 进入主题 下图正是购买的esp8266模块 对于esp01 引脚图如下 二 刷固件 在使用AT指令时 有时候会无法进入AT模式 也就是在串口发送指令 无应答 除了检查引脚和TTL模块是否接错 还可能是需要刷固件 在接线时要注意TT
  • View移动(scrollTo()、scrollBy()方法)

    源码 View java public void scrollTo int x int y if mScrollX x mScrollY y int oldX mScrollX int oldY mScrollY mScrollX x mS
  • 其实UE4资料很丰富

    除了303个shader外 还有program里面的例子
  • QMap & QHash基础应用

    include
  • 神文!高校教授跑了一个月外卖写下这篇文,几千万浏览量,5万+评论

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年7月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 每一个都能笑抽的 39 个奇葩代码注释

    素材来源 网络 1 只有上帝知道 我写这一行的时候 只有上帝和我知道我在写什么 现在 只有上帝知道了 2 相隔时空的 diss somedev1 6 7 02 添加对登录屏幕的暂时追踪功能 somedev2 5 22 07 暂时个屁 仿佛看
  • 在vscode中配置python的安装环境

    一 首先需要下载python版本和vscode的版本 这个需要自己根绝电脑的操作系统进行配置 1 python安装官网 https www python org downloads 但是官网下载很慢 所以可以放到迅雷中进行下载 或者这个也能
  • 【OSS】【Py】OSS出现The specified key does not exist问题

    今天接口的OSS模块出现异常 Exception status 404 x oss request id 5C50209BAE509FEEA16D753E details Code NoSuchKey Message The specifi
  • win10 cpu虚拟化打不开

    win10 cpu 虚拟化打不开 重启进入windows 的bios界面 一共需要调整两处Intel Virtualization Technology 一个在advance下 另一个在advance下的cpu设置里面 两个都设置为enab
  • 软件测试题目汇总

    软件缺陷 1 软件未实现产品说明书要求的功能 2 软件出现了产品说明书指明不应该出现的错误 3 软件实现了产品说明书未提到的功能 4 软件未实现产品说明书虽未明确提及但应该实现的目标 5 软件难以理解 不易使用 运行缓慢或者从测试员的角度看
  • 爬取天眼查 的python 代码

    Description 天眼查关键词爬取风险信息 Author bessie lina Date 2019 08 14 17 39 30 LastEditTime 2019 08 30 16 32 13 LastEditors Please