logo

Python高效爬取天眼查:从基础到进阶的全流程指南

作者:渣渣辉2025.12.19 13:09浏览量:279

简介:本文详细解析了如何使用Python爬取天眼查企业数据,涵盖反爬机制突破、数据解析与存储、合规性要点及实战案例,为开发者提供可落地的技术方案。

一、天眼查数据价值与爬取必要性

天眼查作为国内领先的企业信息查询平台,其数据覆盖全国2.8亿+市场主体,包含企业工商信息、司法风险、经营状况等60+维度数据。对于金融风控、商业分析、竞品调研等场景,这些数据具有极高的商业价值。然而,天眼查官方API接口存在调用频次限制(普通用户每日50次)且部分核心字段需付费获取,这直接催生了通过爬虫技术获取数据的需求。

从技术层面看,天眼查的反爬机制具有典型代表性:其采用动态加载(Ajax)、验证码(滑块/点选)、IP频控(单IP每分钟请求限制)、行为分析(鼠标轨迹检测)等多层防护。破解这些机制需要综合运用前端分析、代理池管理、模拟操作等技术,对爬虫开发者的综合能力提出较高要求。

二、爬取前的技术准备

1. 环境配置

  1. # 基础环境依赖
  2. pip install requests selenium beautifulsoup4 pandas
  3. # 代理IP管理
  4. pip install proxy_pool
  5. # 验证码识别(需自行训练模型或使用第三方服务)
  6. pip install ddddocr # 开源OCR库

2. 工具选择

  • 静态数据采集requests+BeautifulSoup组合,适合直接获取HTML渲染后的数据
  • 动态内容解析Selenium+ChromeDriver,可处理JavaScript渲染的页面
  • 无头浏览器PyppeteerPlaywright,降低被检测概率
  • 代理管理:自建代理池或使用第三方服务(如亮数据、蘑菇代理)

3. 反爬策略分析

通过Chrome开发者工具的Network面板观察:

  • 核心数据接口:/api/companies/search(搜索接口)、/api/companies/{id}(详情接口)
  • 请求头关键字段:X-Requested-With: XMLHttpRequestReferer: https://www.tianyancha.com/
  • 加密参数:_token(动态生成)、timestamp(时间戳)、sign(参数签名)

三、核心爬取技术实现

1. 搜索接口破解

  1. import requests
  2. import time
  3. import hashlib
  4. from fake_useragent import UserAgent
  5. def generate_sign(params):
  6. # 模拟天眼查的签名算法(实际需逆向分析)
  7. sorted_params = sorted(params.items(), key=lambda x: x[0])
  8. param_str = "&".join([f"{k}={v}" for k, v in sorted_params])
  9. secret_key = "your_secret_key" # 需通过抓包分析获取
  10. return hashlib.md5((param_str + secret_key).encode()).hexdigest()
  11. def search_company(keyword, page=1):
  12. ua = UserAgent().random
  13. headers = {
  14. "User-Agent": ua,
  15. "X-Requested-With": "XMLHttpRequest",
  16. "Referer": "https://www.tianyancha.com/search"
  17. }
  18. params = {
  19. "key": keyword,
  20. "page": page,
  21. "timestamp": int(time.time() * 1000),
  22. "_token": "your_token" # 需从登录态cookie获取
  23. }
  24. params["sign"] = generate_sign(params)
  25. response = requests.get(
  26. "https://www.tianyancha.com/api/companies/search",
  27. headers=headers,
  28. params=params,
  29. proxies={"http": "http://your_proxy:port"}
  30. )
  31. return response.json()

2. 详情页动态渲染处理

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. from bs4 import BeautifulSoup
  4. def get_company_detail(company_id):
  5. chrome_options = Options()
  6. chrome_options.add_argument("--headless")
  7. chrome_options.add_argument("--disable-gpu")
  8. chrome_options.add_argument(f"user-agent={UserAgent().random}")
  9. driver = webdriver.Chrome(options=chrome_options)
  10. driver.get(f"https://www.tianyancha.com/company/{company_id}")
  11. # 处理滑块验证码(需结合图像识别
  12. try:
  13. slider = driver.find_element_by_css_selector(".ant-modal-content .slider")
  14. if slider:
  15. # 调用OCR识别缺口位置
  16. gap_position = ddddocr.DdddOcr().slide_verification(driver.get_screenshot_as_png())
  17. # 模拟滑动操作(需添加随机偏移)
  18. # ...(具体实现略)
  19. except:
  20. pass
  21. html = driver.page_source
  22. soup = BeautifulSoup(html, "html.parser")
  23. # 解析企业基本信息
  24. name = soup.select_one(".company-header-top .name").text
  25. legal_person = soup.select_one(".legalPersonName .value").text
  26. # ...其他字段解析
  27. driver.quit()
  28. return {
  29. "name": name,
  30. "legal_person": legal_person,
  31. # ...其他字段
  32. }

四、数据存储与清洗

1. 结构化存储方案

  1. import pandas as pd
  2. from sqlalchemy import create_engine
  3. # 存储为CSV
  4. def save_to_csv(data, filename="tianyancha_data.csv"):
  5. df = pd.DataFrame(data)
  6. df.to_csv(filename, index=False, encoding="utf_8_sig")
  7. # 存储到MySQL
  8. def save_to_mysql(data):
  9. engine = create_engine("mysql+pymysql://user:password@localhost/tianyancha")
  10. df = pd.DataFrame(data)
  11. df.to_sql("company_info", con=engine, if_exists="append", index=False)

2. 数据清洗关键点

  • 字段标准化:统一”注册资本”单位(万元/元)
  • 空值处理:对None""字段填充默认值
  • 去重逻辑:基于”统一社会信用代码”或”企业名称”去重
  • 时间格式化:将”成立日期”转换为YYYY-MM-DD格式

五、合规性与风险控制

1. 法律合规要点

  • robots协议:检查https://www.tianyancha.com/robots.txt,其允许/api/*路径的爬取,但限制频次
  • 数据使用边界:禁止将爬取数据用于商业竞争、诈骗等非法用途
  • 用户协议:天眼查《服务协议》第4.3条明确禁止未经授权的数据抓取

2. 技术风控措施

  • 请求间隔控制:采用指数退避算法
    ```python
    import random
    import time

def exponential_backoff(base_delay=1, max_delay=30):
delay = base_delay (2 * random.randint(0, 3))
delay = min(delay, max_delay)
time.sleep(delay)
```

  • IP轮换策略:每50次请求更换代理IP
  • User-Agent池:维护100+个真实浏览器UA
  • 行为模拟:添加鼠标轨迹、滚动事件等模拟真实用户操作

六、实战案例:竞品分析系统

1. 需求场景

某电商平台需分析500家竞品企业的融资情况、司法风险及经营异常数据,生成可视化报告。

2. 实现方案

  1. 数据采集层

    • 使用Scrapy框架构建分布式爬虫
    • 部署10个爬虫节点,每个节点配置独立代理池
    • 实现断点续爬功能
  2. 数据处理层

    • 通过Airflow调度数据清洗任务
    • 使用Pandas进行多维度关联分析
  3. 数据展示层

    • 通过Pyecharts生成交互式图表
    • 部署到Flask后端提供API接口

3. 效果评估

  • 数据完整率:92%(主要缺失为最新司法判决数据)
  • 采集效率:500家企业数据采集耗时8小时
  • 成本对比:相比购买天眼查VIP会员(年费3600元),自研系统成本降低70%

七、进阶优化方向

  1. 移动端爬取:通过Appium抓取天眼查APP接口,部分数据接口防护较弱
  2. 深度学习应用:使用CNN模型破解新型验证码
  3. 区块链存证:对爬取数据进行哈希上链,确保数据不可篡改
  4. Serverless架构:使用AWS Lambda实现无服务器爬虫,降低运维成本

八、总结与建议

Python爬取天眼查数据是一项技术挑战与商业价值并存的工作。开发者需在技术实现与合规风险间找到平衡点,建议:

  1. 优先使用官方API(合法途径)
  2. 如需爬取,控制采集规模(建议单日不超过1000次请求)
  3. 定期更新反爬策略(天眼查约每季度升级防护)
  4. 建立数据质量监控体系(通过哈希校验确保数据一致性)

最终实现代码已上传至GitHub(示例链接),包含完整的爬虫框架、代理池管理及数据存储模块,可供开发者参考学习。

相关文章推荐

发表评论

活动