logo

Python爬虫实战:高效抓取天眼查企业数据的全流程指南

作者:demo2025.09.18 16:01浏览量:0

简介:本文详细解析如何使用Python爬虫抓取天眼查企业数据,涵盖技术选型、反爬策略应对、数据解析与存储,帮助开发者实现高效数据采集。

Python爬虫实战:高效抓取天眼查企业数据的全流程指南

一、引言:天眼查数据价值与爬虫需求

天眼查作为国内领先的企业信息查询平台,汇聚了超过2亿家企业的工商信息、司法风险、经营状况等数据。对于市场调研、竞品分析、金融风控等场景,天眼查的数据具有极高的商业价值。然而,天眼查通过API接口限制高频查询,且付费会员才能获取完整数据,这促使开发者通过爬虫技术实现数据采集。

本文将系统讲解如何使用Python构建天眼查爬虫,涵盖技术选型、反爬策略应对、数据解析与存储等关键环节,帮助开发者高效、合规地获取所需数据。

二、技术选型与工具准备

1. 核心库选择

  • Requests/HTTPX:用于发送HTTP请求,推荐使用HTTPX支持异步请求。
  • BeautifulSoup/PyQuery:解析HTML响应,PyQuery基于jQuery语法更易用。
  • Selenium/Playwright:应对动态渲染页面,Playwright支持多浏览器且性能更优。
  • Scrapy框架:适合大规模爬取,内置去重、代理管理等功能。

2. 反爬策略应对工具

  • 代理IP池:使用Bright Data、ScraperAPI等付费服务,或自建代理池。
  • User-Agent轮换:通过fake_useragent库模拟不同浏览器。
  • Cookie管理:使用requests.Session()维持会话,或手动处理登录态。

3. 数据存储方案

  • 结构化数据:MySQL/PostgreSQL存储企业基础信息。
  • 非结构化数据:MongoDB存储司法文书等文本数据。
  • 文件存储:CSV/Excel格式用于快速导出分析。

三、天眼查爬虫实现步骤

1. 目标URL分析

以抓取企业基本信息为例,天眼查的企业详情页URL格式为:

  1. https://www.tianyancha.com/company/{company_id}

其中company_id可通过搜索接口获取,或直接从企业列表页解析。

2. 请求头伪装

模拟浏览器访问,关键头信息:

  1. headers = {
  2. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
  3. "Referer": "https://www.tianyancha.com/",
  4. "Cookie": "your_cookie_here" # 需先登录获取
  5. }

3. 动态内容处理

天眼查部分数据通过Ajax加载,需分析网络请求:

  • 方法一:直接请求数据接口
    1. # 示例:抓取企业股东信息
    2. api_url = "https://www.tianyancha.com/api/company/getShareholderList"
    3. params = {
    4. "id": company_id,
    5. "pageSize": 10
    6. }
    7. response = requests.get(api_url, headers=headers, params=params)
  • 方法二:使用Playwright渲染JS

    1. from playwright.sync_api import sync_playwright
    2. with sync_playwright() as p:
    3. browser = p.chromium.launch(headless=False)
    4. page = browser.new_page()
    5. page.goto(f"https://www.tianyancha.com/company/{company_id}")
    6. # 等待特定元素加载
    7. page.wait_for_selector(".shareholder-list")
    8. html = page.content()

4. 数据解析示例

解析企业基本信息(使用PyQuery):

  1. from pyquery import PyQuery as pq
  2. def parse_company_info(html):
  3. doc = pq(html)
  4. company = {
  5. "name": doc(".company-header h1").text(),
  6. "legal_person": doc(".legalPersonName").text(),
  7. "registered_capital": doc(".registeredCapital").text(),
  8. "business_status": doc(".businessStatus").text(),
  9. "phone": doc(".contact-phone").text(),
  10. "email": doc(".contact-email").text()
  11. }
  12. return company

5. 反爬策略应对

  • IP轮换:每10-20次请求更换代理IP
    1. proxies = [
    2. {"http": "http://100.100.100.100:8080"},
    3. {"http": "http://200.200.200.200:8080"}
    4. ]
    5. proxy = random.choice(proxies)
    6. response = requests.get(url, headers=headers, proxies=proxy)
  • 请求间隔:使用time.sleep(random.uniform(1, 3))随机延迟
  • 验证码处理:集成第三方打码平台(如超级鹰)

四、数据存储与后续处理

1. 数据库存储

以MySQL为例,创建企业信息表:

  1. CREATE TABLE company_info (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. name VARCHAR(255) NOT NULL,
  4. legal_person VARCHAR(100),
  5. registered_capital VARCHAR(50),
  6. business_status VARCHAR(50),
  7. phone VARCHAR(20),
  8. email VARCHAR(100),
  9. crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  10. );

Python插入数据:

  1. import pymysql
  2. def save_to_mysql(company):
  3. conn = pymysql.connect(
  4. host="localhost",
  5. user="root",
  6. password="password",
  7. database="tianyancha"
  8. )
  9. try:
  10. with conn.cursor() as cursor:
  11. sql = """
  12. INSERT INTO company_info
  13. (name, legal_person, registered_capital, business_status, phone, email)
  14. VALUES (%s, %s, %s, %s, %s, %s)
  15. """
  16. cursor.execute(sql, (
  17. company["name"],
  18. company["legal_person"],
  19. company["registered_capital"],
  20. company["business_status"],
  21. company["phone"],
  22. company["email"]
  23. ))
  24. conn.commit()
  25. finally:
  26. conn.close()

2. 数据清洗与分析

  • 去重:基于企业名称或统一社会信用代码
  • 标准化:统一电话、邮箱格式
  • 分析示例:统计某行业企业注册资本分布

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. df = pd.read_sql("SELECT * FROM company_info WHERE industry LIKE '%科技%'", conn)
    4. df["registered_capital"] = df["registered_capital"].str.replace("万人民币", "").astype(float)
    5. df["registered_capital"].hist(bins=20)
    6. plt.show()

五、法律与伦理注意事项

  1. 遵守robots协议:检查https://www.tianyancha.com/robots.txt,避免抓取禁止内容。
  2. 限制抓取频率:建议QPS不超过1,避免对服务器造成压力。
  3. 数据使用合规:仅用于个人学习或合法商业分析,不得用于非法用途。
  4. 隐私保护:不得公开或传播涉及个人隐私的数据(如高管身份证号)。

六、优化与扩展建议

  1. 分布式爬取:使用Scrapy-Redis实现多节点协作。
  2. 增量抓取:记录已抓取企业ID,避免重复。
  3. 异常处理:捕获网络超时、解析错误等异常,保证爬虫稳定性。
  4. 可视化监控:通过Prometheus+Grafana监控爬虫运行状态。

七、总结

本文系统讲解了Python爬取天眼查数据的完整流程,从技术选型到反爬策略,再到数据存储与分析。开发者需注意合规性,通过合理设置请求间隔、使用代理IP等方式降低被封风险。实际项目中,建议先从小规模抓取测试,逐步优化代码结构。天眼查的数据价值巨大,但合法、高效地获取数据才是长期运行的关键。

相关文章推荐

发表评论