logo

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

作者:起个名字好难2025.09.18 16:01浏览量:1

简介:本文详细解析如何使用Python技术栈爬取天眼查公开数据,涵盖反爬机制应对、数据解析与存储等核心环节,提供可复用的代码框架与合规使用建议。

一、爬取天眼查的合规性与前提准备

1.1 法律边界与数据合规

天眼查作为企业信息查询平台,其公开数据受《网络安全法》和《数据安全法》约束。在爬取前需明确:仅限爬取公开可访问数据(如企业基础信息、工商变更记录),禁止获取付费会员专属数据或进行高频次请求干扰服务。建议通过平台官方API获取结构化数据,若选择爬虫方式需控制请求频率(建议≤1次/秒)。

1.2 技术环境搭建

推荐使用Python 3.8+环境,核心依赖库包括:

  1. # 基础爬虫库
  2. requests==2.28.1
  3. BeautifulSoup4==4.11.1
  4. # 动态渲染处理
  5. selenium==4.1.0
  6. webdriver-manager==3.5.4
  7. # 数据存储
  8. pymongo==4.1.1 # MongoDB存储
  9. pandas==1.4.2 # 结构化处理

二、天眼查反爬机制解析与应对策略

2.1 常见反爬手段

  • IP限制:单IP每小时请求超过30次触发验证码
  • 行为检测:通过鼠标轨迹、停留时间等识别机器人
  • 数据加密:关键字段采用JSONP或自定义加密协议
  • 参数签名:请求参数包含动态生成的_token字段

2.2 突破方案

2.2.1 动态渲染处理

使用Selenium模拟浏览器行为:

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. from webdriver_manager.chrome import ChromeDriverManager
  4. options = Options()
  5. options.add_argument("--headless") # 无头模式
  6. options.add_argument("--disable-gpu")
  7. driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
  8. driver.get("https://www.tianyancha.com/search?key=阿里巴巴")
  9. # 等待动态加载完成
  10. driver.implicitly_wait(10)
  11. html = driver.page_source

2.2.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. "X-Requested-With": "XMLHttpRequest"
  5. }

2.2.3 代理IP池管理

建议使用付费代理服务(如亮数据、芝麻代理),配合轮询机制:

  1. import requests
  2. from itertools import cycle
  3. proxies = [
  4. {"http": "http://101.200.123.45:8080"},
  5. {"http": "http://102.201.124.46:8081"}
  6. ]
  7. proxy_pool = cycle(proxies)
  8. def get_page(url):
  9. try:
  10. proxy = next(proxy_pool)
  11. response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
  12. if response.status_code == 200:
  13. return response.text
  14. else:
  15. return None
  16. except:
  17. return None

三、核心数据爬取实现

3.1 企业列表页抓取

以搜索”人工智能”企业为例:

  1. def search_companies(keyword, page=1):
  2. url = f"https://www.tianyancha.com/search?key={keyword}&page={page}"
  3. html = get_page(url)
  4. if not html:
  5. return []
  6. # 使用正则提取企业ID(示例简化)
  7. import re
  8. pattern = r'data-id="(\d+)"'
  9. company_ids = re.findall(pattern, html)
  10. return company_ids

3.2 企业详情页解析

使用BeautifulSoup提取关键信息:

  1. from bs4 import BeautifulSoup
  2. def parse_company_detail(company_id):
  3. url = f"https://www.tianyancha.com/company/{company_id}"
  4. html = get_page(url)
  5. if not html:
  6. return None
  7. soup = BeautifulSoup(html, 'html.parser')
  8. # 提取企业名称
  9. name = soup.find('h1', class_='name').text.strip()
  10. # 提取法人信息
  11. legal_person = soup.find('div', class_='legalPersonName').text.strip()
  12. # 提取注册资本
  13. reg_capital = soup.find('div', class_='regCapital').text.strip()
  14. return {
  15. "name": name,
  16. "legal_person": legal_person,
  17. "reg_capital": reg_capital
  18. }

3.3 工商信息API调用(推荐方案)

天眼查官方提供结构化API,响应示例:

  1. {
  2. "status": 200,
  3. "data": {
  4. "companyName": "阿里巴巴集团",
  5. "legalPerson": "张勇",
  6. "regCapital": "5000万美元",
  7. "establishTime": "1999-09-09"
  8. }
  9. }

Python调用示例:

  1. import requests
  2. def get_company_api(company_name):
  3. url = "https://api.tianyancha.com/services/v3/open/search"
  4. params = {
  5. "key": company_name,
  6. "pageSize": 10
  7. }
  8. headers = {
  9. "Authorization": "Bearer YOUR_API_KEY" # 需申请官方API权限
  10. }
  11. response = requests.get(url, headers=headers, params=params)
  12. return response.json()

四、数据存储与处理

4.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. if isinstance(data, list):
  7. collection.insert_many(data)
  8. else:
  9. collection.insert_one(data)

4.2 Pandas数据分析

  1. import pandas as pd
  2. # 从MongoDB导出到DataFrame
  3. df = pd.DataFrame(list(collection.find()))
  4. # 注册资本数值化处理
  5. df['reg_capital_num'] = df['reg_capital'].str.extract(r'(\d+\.?\d*)').astype(float)
  6. # 按注册资本排序
  7. top_companies = df.sort_values('reg_capital_num', ascending=False).head(10)

五、进阶优化技巧

5.1 分布式爬虫架构

采用Scrapy+Redis实现分布式:

  1. # scrapy_redis示例配置
  2. REDIS_URL = "redis://localhost:6379/0"
  3. DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
  4. SCHEDULER = "scrapy_redis.scheduler.Scheduler"

5.2 异常处理机制

  1. import time
  2. from random import uniform
  3. def robust_request(url, max_retries=3):
  4. for attempt in range(max_retries):
  5. try:
  6. response = requests.get(url, headers=headers, timeout=15)
  7. if response.status_code == 200:
  8. return response
  9. elif response.status_code == 429: # 请求过于频繁
  10. time.sleep(uniform(5, 10))
  11. continue
  12. except Exception as e:
  13. print(f"Attempt {attempt + 1} failed: {str(e)}")
  14. time.sleep(uniform(2, 5))
  15. return None

六、合规使用建议

  1. 频率控制:单IP请求间隔≥2秒,日请求量≤1000次
  2. 数据用途:仅限个人研究或内部分析,禁止商业转售
  3. 缓存机制:对已获取数据建立本地缓存,避免重复请求
  4. 异常监控:设置403/502错误报警,及时调整爬取策略

通过上述技术方案,开发者可在合规框架内高效获取天眼查公开数据。实际项目中建议优先使用官方API,对于研究性需求可采用爬虫方案,但需严格遵守robots协议和平台使用条款。

相关文章推荐

发表评论