Python高效爬取天眼查数据:从入门到实践指南
2025.09.18 16:01浏览量:1简介:本文详细解析如何使用Python技术栈爬取天眼查公开数据,涵盖反爬机制应对、数据解析与存储等核心环节,提供可复用的代码框架与合规使用建议。
一、爬取天眼查的合规性与前提准备
1.1 法律边界与数据合规
天眼查作为企业信息查询平台,其公开数据受《网络安全法》和《数据安全法》约束。在爬取前需明确:仅限爬取公开可访问数据(如企业基础信息、工商变更记录),禁止获取付费会员专属数据或进行高频次请求干扰服务。建议通过平台官方API获取结构化数据,若选择爬虫方式需控制请求频率(建议≤1次/秒)。
1.2 技术环境搭建
推荐使用Python 3.8+环境,核心依赖库包括:
二、天眼查反爬机制解析与应对策略
2.1 常见反爬手段
- IP限制:单IP每小时请求超过30次触发验证码
- 行为检测:通过鼠标轨迹、停留时间等识别机器人
- 数据加密:关键字段采用JSONP或自定义加密协议
- 参数签名:请求参数包含动态生成的
_token
字段
2.2 突破方案
2.2.1 动态渲染处理
使用Selenium模拟浏览器行为:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.add_argument("--headless") # 无头模式
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get("https://www.tianyancha.com/search?key=阿里巴巴")
# 等待动态加载完成
driver.implicitly_wait(10)
html = driver.page_source
2.2.2 请求头伪装
构建合规的请求头:
headers = {
"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",
"Referer": "https://www.tianyancha.com/",
"X-Requested-With": "XMLHttpRequest"
}
2.2.3 代理IP池管理
建议使用付费代理服务(如亮数据、芝麻代理),配合轮询机制:
import requests
from itertools import cycle
proxies = [
{"http": "http://101.200.123.45:8080"},
{"http": "http://102.201.124.46:8081"}
]
proxy_pool = cycle(proxies)
def get_page(url):
try:
proxy = next(proxy_pool)
response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
if response.status_code == 200:
return response.text
else:
return None
except:
return None
三、核心数据爬取实现
3.1 企业列表页抓取
以搜索”人工智能”企业为例:
def search_companies(keyword, page=1):
url = f"https://www.tianyancha.com/search?key={keyword}&page={page}"
html = get_page(url)
if not html:
return []
# 使用正则提取企业ID(示例简化)
import re
pattern = r'data-id="(\d+)"'
company_ids = re.findall(pattern, html)
return company_ids
3.2 企业详情页解析
使用BeautifulSoup提取关键信息:
from bs4 import BeautifulSoup
def parse_company_detail(company_id):
url = f"https://www.tianyancha.com/company/{company_id}"
html = get_page(url)
if not html:
return None
soup = BeautifulSoup(html, 'html.parser')
# 提取企业名称
name = soup.find('h1', class_='name').text.strip()
# 提取法人信息
legal_person = soup.find('div', class_='legalPersonName').text.strip()
# 提取注册资本
reg_capital = soup.find('div', class_='regCapital').text.strip()
return {
"name": name,
"legal_person": legal_person,
"reg_capital": reg_capital
}
3.3 工商信息API调用(推荐方案)
天眼查官方提供结构化API,响应示例:
{
"status": 200,
"data": {
"companyName": "阿里巴巴集团",
"legalPerson": "张勇",
"regCapital": "5000万美元",
"establishTime": "1999-09-09"
}
}
Python调用示例:
import requests
def get_company_api(company_name):
url = "https://api.tianyancha.com/services/v3/open/search"
params = {
"key": company_name,
"pageSize": 10
}
headers = {
"Authorization": "Bearer YOUR_API_KEY" # 需申请官方API权限
}
response = requests.get(url, headers=headers, params=params)
return response.json()
四、数据存储与处理
4.1 MongoDB存储方案
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017/")
db = client["tianyancha"]
collection = db["companies"]
def save_to_mongo(data):
if isinstance(data, list):
collection.insert_many(data)
else:
collection.insert_one(data)
4.2 Pandas数据分析
import pandas as pd
# 从MongoDB导出到DataFrame
df = pd.DataFrame(list(collection.find()))
# 注册资本数值化处理
df['reg_capital_num'] = df['reg_capital'].str.extract(r'(\d+\.?\d*)').astype(float)
# 按注册资本排序
top_companies = df.sort_values('reg_capital_num', ascending=False).head(10)
五、进阶优化技巧
5.1 分布式爬虫架构
采用Scrapy+Redis实现分布式:
# scrapy_redis示例配置
REDIS_URL = "redis://localhost:6379/0"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
5.2 异常处理机制
import time
from random import uniform
def robust_request(url, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, timeout=15)
if response.status_code == 200:
return response
elif response.status_code == 429: # 请求过于频繁
time.sleep(uniform(5, 10))
continue
except Exception as e:
print(f"Attempt {attempt + 1} failed: {str(e)}")
time.sleep(uniform(2, 5))
return None
六、合规使用建议
- 频率控制:单IP请求间隔≥2秒,日请求量≤1000次
- 数据用途:仅限个人研究或内部分析,禁止商业转售
- 缓存机制:对已获取数据建立本地缓存,避免重复请求
- 异常监控:设置403/502错误报警,及时调整爬取策略
通过上述技术方案,开发者可在合规框架内高效获取天眼查公开数据。实际项目中建议优先使用官方API,对于研究性需求可采用爬虫方案,但需严格遵守robots协议和平台使用条款。
发表评论
登录后可评论,请前往 登录 或 注册