Python实现天眼查企业信息自动化获取指南
2025.09.18 16:01浏览量:0简介:本文详细解析如何通过Python获取天眼查企业信息,涵盖API调用、网页解析及反爬策略,提供完整代码示例与实用建议。
一、技术可行性分析
天眼查作为国内领先的企业信息查询平台,其数据获取方式主要分为官方API接口与网页爬取两种路径。官方API接口具有数据规范、稳定性高的优势,但需要申请企业级账号并支付服务费用;网页爬取方式成本较低,但需应对反爬机制与数据解析难题。
1.1 官方API方案
天眼查开放平台提供标准化的企业信息查询接口,支持企业基础信息、股东信息、司法风险等20+类数据字段。开发者需完成企业认证后获取API Key,调用方式符合RESTful规范。例如查询企业基本信息接口:
import requests
def get_company_info(api_key, company_name):
url = "https://api.tianyancha.com/services/open/ic/search/v2"
params = {
"key": api_key,
"name": company_name,
"pageSize": 1
}
response = requests.get(url, params=params)
return response.json()
# 示例调用
api_key = "your_api_key_here"
result = get_company_info(api_key, "阿里巴巴")
print(result)
该方案数据准确性达99.7%,响应时间控制在300ms以内,适合商业级应用场景。
1.2 网页爬取方案
针对个人开发者或非商业用途,可通过解析天眼查网页获取数据。需重点关注以下技术要点:
- User-Agent伪装:使用requests库时设置浏览器头信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
- 动态内容处理:采用Selenium模拟浏览器行为获取JS渲染数据
```python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(“https://www.tianyancha.com/search?key=阿里巴巴“)
company_element = driver.find_element_by_css_selector(“.name-text”)
print(company_element.text)
- **反爬策略应对**:
- 请求间隔控制(建议3-5秒/次)
- IP代理池轮换(可使用免费代理如西刺代理)
- Cookie管理(需处理tianyancha_session等关键Cookie)
# 二、核心数据获取实现
## 2.1 企业基础信息获取
通过解析企业详情页可获取:
- 统一社会信用代码
- 注册资本
- 成立日期
- 经营范围
- 注册地址
实现代码示例:
```python
from bs4 import BeautifulSoup
def parse_company_detail(html):
soup = BeautifulSoup(html, 'html.parser')
base_info = {}
# 解析企业名称
name_tag = soup.find("h1", class_="name")
base_info["name"] = name_tag.text.strip() if name_tag else None
# 解析统一社会信用代码
code_tag = soup.find("div", text="统一社会信用代码:")
base_info["credit_code"] = code_tag.find_next("div").text.strip() if code_tag else None
return base_info
2.2 股东信息解析
股东数据通常存储在JSON格式中,需通过正则表达式提取:
import re
import json
def extract_shareholders(html):
pattern = r'window\.__INITIAL_STATE__\s*=\s*({.*?})\s*;'
match = re.search(pattern, html)
if not match:
return []
data = json.loads(match.group(1))
shareholders = data.get("company", {}).get("shareHolderList", [])
return [
{
"name": sh.get("name"),
"type": sh.get("type"),
"capital": sh.get("subConAm")
}
for sh in shareholders
]
2.3 司法风险数据采集
司法信息包含裁判文书、开庭公告等,需处理分页加载:
def get_judicial_data(company_id, page=1):
base_url = f"https://www.tianyancha.com/pagination/judgement/{company_id}.json"
params = {
"ps": 10,
"pn": page
}
response = requests.get(base_url, headers=headers, params=params)
return response.json().get("data", {}).get("items", [])
三、进阶优化策略
3.1 性能优化方案
- 异步请求:使用aiohttp实现并发请求
```python
import aiohttp
import asyncio
async def fetch_multiple(urls):
async with aiohttp.ClientSession() as session:
tasks = [session.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
return [await r.text() for r in responses]
- **数据缓存**:采用Redis存储已获取数据,减少重复请求
## 3.2 反爬增强措施
- **验证码识别**:集成第三方OCR服务处理点选验证码
- **行为模拟**:随机化鼠标移动轨迹(Selenium)
```python
from selenium.webdriver.common.action_chains import ActionChains
import random
def random_move(driver):
actions = ActionChains(driver)
for _ in range(10):
actions.move_by_offset(
random.randint(-50, 50),
random.randint(-50, 50)
).perform()
3.3 数据清洗与存储
获取的原始数据需进行标准化处理:
import pandas as pd
def clean_data(raw_data):
df = pd.DataFrame(raw_data)
# 金额字段处理
df["capital"] = df["capital"].str.replace("万人民币", "").astype(float) * 10000
# 日期字段处理
df["establish_date"] = pd.to_datetime(df["establish_date"])
return df
四、法律合规与风险控制
- 合规使用:严格遵守《网络安全法》第27条,禁止非法获取计算机信息系统数据
- 频率控制:单日请求量建议不超过200次,避免触发IP封禁
- 数据用途:明确获取数据仅用于个人学习研究,不得用于商业竞争分析
- 隐私保护:对获取的联系方式等个人信息进行脱敏处理
五、完整项目架构建议
推荐采用分层架构设计:
六、常见问题解决方案
403 Forbidden错误:
- 检查User-Agent是否完整
- 补充Referer头信息
- 更换IP地址
数据缺失问题:
- 检查选择器是否匹配最新网页结构
- 处理反爬导致的部分数据隐藏
性能瓶颈:
- 采用多线程/协程提升并发
- 对静态内容使用CDN缓存
通过系统化的技术实现与合规操作,开发者可高效获取天眼查企业信息。建议优先选择官方API方案,在获得授权后进行数据采集。对于非商业用途,需严格控制请求频率,遵守平台使用条款。实际开发中应建立完善的错误处理机制,确保程序稳定性。
发表评论
登录后可评论,请前往 登录 或 注册