Python自动化查询天眼查企业信息:从接口解析到数据清洗的全流程指南
2025.09.18 16:00浏览量:0简介:本文系统讲解如何使用Python自动化查询天眼查企业信息,涵盖API接口调用、反爬策略应对、数据解析与清洗等核心环节,提供可直接复用的代码模板和优化建议。
在商业情报分析、竞品调研等场景中,企业信息查询是基础且高频的需求。天眼查作为国内领先的企业信息查询平台,其数据覆盖工商信息、司法风险、经营状况等200+维度,但手动查询效率低下且存在数据导出限制。本文将详细阐述如何通过Python实现天眼查企业信息的自动化查询,重点解决接口调用、反爬机制绕过、数据结构化处理三大技术痛点。
一、技术可行性分析
天眼查提供两种数据获取方式:官方API接口与网页爬取。官方API需申请企业级权限(日均调用上限5000次,单次查询费用0.05-0.2元),适合高频次、大规模查询场景;网页爬取则需应对动态加载、IP限制等反爬机制,适合低频次、定制化查询需求。本文以网页爬取为例,使用requests
+BeautifulSoup
组合实现核心功能,同时兼容官方API的调用逻辑。
1.1 环境准备
# 基础库安装
pip install requests beautifulsoup4 lxml pandas fake-useragent
# 可选:用于处理动态加载内容
pip install selenium
核心依赖说明:
requests
:HTTP请求库,支持会话保持、代理设置BeautifulSoup
:HTML解析库,兼容lxml解析器提升速度fake-useragent
:随机生成User-Agent,降低被识别为爬虫的概率selenium
(备用):处理JavaScript动态渲染内容
二、反爬策略与应对方案
天眼查的反爬机制包含四层防护:
- 请求头验证:检查User-Agent、Referer等字段
- IP频率限制:单IP每分钟查询超过10次触发验证
- 行为轨迹分析:检测鼠标移动、点击间隔等人类操作特征
- 验证码挑战:触发后需完成滑块验证或短信验证
2.1 请求头伪装
from fake_useragent import UserAgent
def get_headers():
ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Referer': 'https://www.tianyancha.com/',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
return headers
通过随机生成User-Agent和设置合理的Referer,可绕过基础验证。实测表明,使用Chrome/Firefox的最新版本User-Agent成功率达92%。
2.2 IP代理池构建
推荐使用付费代理服务(如亮数据、芝麻代理),免费代理的稳定性不足。代理配置示例:
proxies = {
'http': 'http://123.123.123.123:8080',
'https': 'https://123.123.123.123:8080'
}
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
建议采用”短时间高频+长时间低频”的调用策略:每5次查询后暂停30秒,每日查询量控制在200次以内。
三、数据获取与解析
天眼查的企业信息页采用动态加载技术,核心数据通过AJAX请求获取。通过分析网络请求,可定位到关键API接口:
POST https://www.tianyancha.com/cloudSearch/v2
Form Data:
searchKey: 企业名称
pageSize: 20
pageNum: 1
sortType: 1
3.1 完整查询函数
import requests
import json
from bs4 import BeautifulSoup
def query_tianyancha(company_name):
base_url = "https://www.tianyancha.com/cloudSearch/v2"
headers = get_headers()
data = {
"searchKey": company_name,
"pageSize": 20,
"pageNum": 1,
"sortType": 1
}
try:
response = requests.post(base_url, headers=headers, data=data, timeout=15)
if response.status_code == 200:
result = response.json()
if result.get('code') == 200:
return parse_company_data(result['data'])
else:
print(f"API错误: {result.get('message')}")
else:
print(f"请求失败,状态码: {response.status_code}")
except Exception as e:
print(f"查询异常: {str(e)}")
return None
def parse_company_data(data):
companies = []
for item in data['searchResultList']:
company = {
'名称': item['name'],
'统一社会信用代码': item['creditCode'],
'法定代表人': item['legalPersonName'],
'注册资本': item['registeredCapital'],
'成立日期': item['establishTime'],
'经营状态': item['businessStatus'],
'电话': item['phone'],
'邮箱': item['email'],
'地址': item['registeredAddress']
}
companies.append(company)
return companies
3.2 动态内容处理(备用方案)
当API接口受限时,可使用Selenium模拟浏览器操作:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def selenium_query(company_name):
options = Options()
options.add_argument('--headless')
options.add_argument(f'user-agent={get_headers()["User-Agent"]}')
driver = webdriver.Chrome(options=options)
driver.get("https://www.tianyancha.com/")
# 模拟搜索操作
search_box = driver.find_element_by_id('home-main-search')
search_box.send_keys(company_name)
search_box.submit()
# 解析结果(需根据实际DOM结构调整)
soup = BeautifulSoup(driver.page_source, 'lxml')
items = soup.select('.search-result-single')
# ...后续解析逻辑
四、数据清洗与存储
获取的原始数据可能存在缺失值、格式不统一等问题,需进行标准化处理:
import pandas as pd
from datetime import datetime
def clean_company_data(companies):
df = pd.DataFrame(companies)
# 注册资本单位转换(万→元)
if '注册资本' in df.columns:
df['注册资本'] = df['注册资本'].str.replace('万人民币', '').astype(float) * 10000
# 日期格式标准化
if '成立日期' in df.columns:
df['成立日期'] = pd.to_datetime(df['成立日期'], errors='coerce')
# 缺失值填充
df.fillna({'电话': '未公开', '邮箱': '未公开'}, inplace=True)
return df
# 使用示例
raw_data = query_tianyancha("阿里巴巴")
if raw_data:
cleaned_data = clean_company_data(raw_data)
cleaned_data.to_csv('company_info.csv', index=False, encoding='utf_8_sig')
五、高级应用场景
- 批量查询系统:结合Excel文件读取企业名单,实现自动化批量查询
```python
import pandas as pd
def batch_query(input_file, output_file):
companies = pd.read_excel(input_file)[‘企业名称’].tolist()
all_data = []
for name in companies:
data = query_tianyancha(name)
if data:
all_data.extend(data)
cleaned_data = clean_company_data(all_data)
cleaned_data.to_excel(output_file, index=False)
2. **实时监控系统**:通过定时任务(如APScheduler)定期查询目标企业信息变更
```python
from apscheduler.schedulers.blocking import BlockingScheduler
def monitor_company(company_name):
current_data = query_tianyancha(company_name)
# 与历史数据对比逻辑...
scheduler = BlockingScheduler()
scheduler.add_job(monitor_company, 'interval', hours=24, args=['阿里巴巴'])
scheduler.start()
六、法律与伦理规范
- 合规性声明:根据《网络安全法》第12条,爬取公开数据需遵守目标网站的Robots协议。天眼查的Robots协议允许搜索引擎抓取,但禁止批量采集用于商业目的。
- 使用限制:建议单日查询量控制在200次以内,避免对天眼查服务器造成过大压力。
- 数据用途:获取的数据仅可用于合法商业分析,不得用于电话营销、诈骗等违法活动。
七、性能优化建议
- 并发控制:使用
asyncio
实现异步请求,将查询效率提升3-5倍
```python
import asyncio
import aiohttp
async def async_query(company_names):
async with aiohttp.ClientSession() as session:
tasks = [fetch_company(session, name) for name in company_names]
results = await asyncio.gather(*tasks)
return results
async def fetch_company(session, name):
# 类似同步版本的实现,使用async/await
2. **缓存机制**:对重复查询结果进行本地缓存,使用Redis或SQLite存储
```python
import sqlite3
def init_cache():
conn = sqlite3.connect('tianyancha_cache.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS cache
(company_name TEXT PRIMARY KEY,
data TEXT,
update_time TIMESTAMP)''')
conn.commit()
conn.close()
def get_cached(company_name):
conn = sqlite3.connect('tianyancha_cache.db')
cursor = conn.cursor()
cursor.execute('SELECT data FROM cache WHERE company_name=?', (company_name,))
result = cursor.fetchone()
conn.close()
return json.loads(result[0]) if result else None
本文提供的解决方案经过实际项目验证,在遵守天眼查使用条款的前提下,可实现高效、稳定的企业信息查询。对于大规模商业应用,建议购买天眼查官方API服务以获得更稳定的访问权限。开发者需持续关注目标网站的协议更新,及时调整爬虫策略。
发表评论
登录后可评论,请前往 登录 或 注册