logo

Python高效爬取天眼查数据:从入门到实战指南

作者:问题终结者2025.09.18 16:01浏览量:0

简介:本文详细解析如何使用Python爬取天眼查企业数据,涵盖反爬机制破解、数据解析、存储及法律合规要点,提供完整代码示例与实战技巧。

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

天眼查作为国内领先的企业信息查询平台,汇聚了超2亿家企业的工商信息、司法风险、经营状况等结构化数据。对于金融风控、市场调研、商业分析等领域,这些数据具有极高的商业价值。然而,天眼查官方API调用存在配额限制且部分字段需付费,促使开发者通过爬虫技术获取公开数据。

需特别注意:根据《网络安全法》第二十七条,未经授权的深度爬取可能涉及侵犯计算机信息系统罪。建议仅爬取企业公开的工商信息、司法判决等已公示数据,避免获取用户联系方式等隐私信息。

二、爬取前的技术准备

1. 环境配置

  1. # 基础环境安装
  2. pip install requests selenium beautifulsoup4 pymongo scrapy
  3. # 浏览器驱动配置(以Chrome为例)
  4. from selenium import webdriver
  5. options = webdriver.ChromeOptions()
  6. options.add_argument('--headless') # 无头模式
  7. driver = webdriver.Chrome(options=options, executable_path='/path/to/chromedriver')

2. 反爬机制分析

天眼查采用多层级反爬策略:

  • IP限制:单IP每小时请求超过30次触发验证码
  • 行为检测:通过鼠标轨迹、点击间隔识别自动化工具
  • 数据加密:关键参数如tsign通过JS动态生成

解决方案:

  • 使用代理IP池(推荐Bright Data、ScraperAPI)
  • 模拟人类操作(随机延迟、滚动事件)
  • 破解加密参数(逆向分析JS代码)

三、核心爬取技术实现

1. 搜索接口破解

通过抓包分析发现,天眼查搜索采用POST请求:

  1. import requests
  2. import json
  3. def search_company(keyword):
  4. url = "https://www.tianyancha.com/search"
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
  7. "Referer": "https://www.tianyancha.com/"
  8. }
  9. params = {
  10. "key": keyword,
  11. "pageSize": 10,
  12. "pageNum": 1
  13. }
  14. response = requests.post(url, headers=headers, data=json.dumps(params))
  15. return response.json()

2. 动态参数破解

对于加密参数_token,可通过执行JS获取:

  1. from selenium.webdriver.common.by import By
  2. import execjs
  3. def get_token(driver):
  4. # 加载天眼查页面
  5. driver.get("https://www.tianyancha.com")
  6. # 提取JS代码片段
  7. js_code = driver.find_element(By.XPATH, '//script[contains(text(), "_token")]').text
  8. # 使用PyExecJS执行
  9. ctx = execjs.compile(js_code)
  10. token = ctx.eval("getToken()")
  11. return token

3. 详情页解析

使用BeautifulSoup提取企业核心信息:

  1. from bs4 import BeautifulSoup
  2. def parse_company_detail(html):
  3. soup = BeautifulSoup(html, 'html.parser')
  4. data = {
  5. "name": soup.find('div', class_='company-header').find('h1').text,
  6. "legal_person": soup.select('.legalPersonName')[0].text,
  7. "registered_capital": soup.select('.registeredCapital')[0].text,
  8. "business_scope": soup.select('.businessScope')[0].text.strip()
  9. }
  10. return data

四、数据存储方案

1. MongoDB存储

  1. from pymongo import MongoClient
  2. client = MongoClient('mongodb://localhost:27017/')
  3. db = client['tianyancha']
  4. collection = db['companies']
  5. def save_to_mongo(data):
  6. collection.insert_one({
  7. "name": data["name"],
  8. "legal_person": data["legal_person"],
  9. "crawl_time": datetime.now()
  10. })

2. CSV导出

  1. import csv
  2. def save_to_csv(data_list, filename):
  3. with open(filename, 'w', newline='', encoding='utf-8') as f:
  4. writer = csv.DictWriter(f, fieldnames=data_list[0].keys())
  5. writer.writeheader()
  6. writer.writerows(data_list)

五、法律合规与风险控制

  1. robots协议:检查https://www.tianyancha.com/robots.txt,遵守爬取频率限制
  2. 数据用途声明:在用户协议中明确数据仅用于合法商业分析
  3. 异常处理
    1. try:
    2. response = requests.get(url, timeout=10)
    3. response.raise_for_status()
    4. except requests.exceptions.RequestException as e:
    5. print(f"请求失败: {e}")
    6. # 触发IP轮换逻辑

六、进阶优化技巧

  1. 分布式爬取:使用Scrapy-Redis实现多节点协作
  2. 增量更新:通过last_modified字段实现增量抓取
  3. 数据清洗
    ```python
    import re

def clean_capital(text):

  1. # 处理"500万人民币"等格式
  2. match = re.search(r'(\d+\.?\d*)\s*(万|亿)?', text)
  3. if match:
  4. value = float(match.group(1))
  5. unit = match.group(2)
  6. if unit == '万':
  7. return value * 10000
  8. elif unit == '亿':
  9. return value * 100000000
  10. return None
  1. ### 七、完整案例演示
  2. ```python
  3. # 综合示例:爬取指定行业企业列表
  4. def crawl_industry(industry_name, max_pages=5):
  5. all_data = []
  6. for page in range(1, max_pages+1):
  7. params = {
  8. "key": industry_name,
  9. "pageSize": 20,
  10. "pageNum": page
  11. }
  12. response = search_company(params)
  13. for item in response["data"]["items"]:
  14. company_id = item["id"]
  15. detail_url = f"https://www.tianyancha.com/company/{company_id}"
  16. # 此处应添加获取详情页的逻辑
  17. # 模拟获取的数据
  18. detail_data = {
  19. "name": item["name"],
  20. "status": item["status"]
  21. }
  22. all_data.append(detail_data)
  23. time.sleep(random.uniform(2, 5)) # 随机延迟
  24. save_to_csv(all_data, f"{industry_name}_companies.csv")

八、常见问题解决方案

  1. 验证码问题

    • 使用打码平台(如超级鹰)
    • 手动输入验证码接口
  2. 数据缺失

    • 检查XPath/CSS选择器是否更新
    • 对比网页源码与解析结果
  3. 性能瓶颈

    • 采用异步请求(aiohttp)
    • 使用多线程(ThreadPoolExecutor)

九、总结与建议

  1. 合规优先:始终将法律风险控制放在首位
  2. 稳健架构:设计可扩展的爬虫框架,便于后期维护
  3. 持续监控:建立爬虫健康检查机制,及时处理反爬策略更新

建议开发者:

  • 优先使用官方API获取结构化数据
  • 爬取频率控制在合理范围(建议QPS<1)
  • 定期备份爬取数据,防止丢失

通过本文介绍的技术方案,开发者可在遵守法律法规的前提下,高效获取天眼查的公开企业数据,为商业决策提供有力支持。实际开发中需根据具体需求调整爬取策略,并持续关注目标网站的反爬机制更新。

相关文章推荐

发表评论