Python高效爬取企查查工商信息指南
2025.09.18 16:01浏览量:0简介:本文详细解析如何使用Python爬取企查查工商信息,涵盖反爬机制应对、数据解析与存储,提供完整代码示例及合规建议。
一、企查查数据价值与爬取背景
企查查作为国内领先的商业信息查询平台,聚合了超过2亿家企业的工商注册、股东信息、司法风险等核心数据。这些结构化数据对于市场调研、竞品分析、风险控制等场景具有重要价值。例如金融机构可通过企业股权结构判断关联交易风险,咨询公司可基于行业数据分布制定市场策略。
传统获取方式存在三大痛点:手动查询效率低下(单企业查询需15-30秒)、批量数据获取成本高昂(API接口年费数万元)、数据维度受限(免费版仅展示基础信息)。Python爬虫技术可实现分钟级获取千家企业数据,成本降低90%以上,且支持自定义数据维度。
二、爬取技术架构设计
1. 请求头伪装技术
企查查反爬系统通过User-Agent检测、Referer校验、Cookie追踪三重机制识别爬虫。需构建动态请求头:
import random
from fake_useragent import UserAgent
def generate_headers():
ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Referer': 'https://www.qcc.com/',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': '你的Cookie值' # 需定期更新
}
return headers
2. 动态参数解析
搜索接口采用多重加密参数,包括:
searchKey
:Base64编码的搜索词token
:动态生成的JS变量timestamp
:毫秒级时间戳
通过逆向分析发现,核心参数可通过以下方式获取:
import base64
import time
import execjs
def get_search_params(keyword):
# 模拟JS加密过程
js_code = """
function encrypt(key) {
var arr = key.split('');
for(var i=0; i<arr.length; i++) {
arr[i] = String.fromCharCode(arr[i].charCodeAt(0)^0x66);
}
return btoa(arr.join(''));
}
"""
ctx = execjs.compile(js_code)
encrypted_key = ctx.call('encrypt', keyword)
params = {
'searchKey': base64.b64encode(encrypted_key.encode()).decode(),
'token': '动态获取的token值',
't': int(time.time() * 1000)
}
return params
3. 分页处理策略
企查查采用滚动加载机制,每页显示20条数据。通过分析XHR请求,发现分页参数pageNum
与pageSize
组合控制数据加载。实现自动翻页的代码示例:
import requests
from urllib.parse import urlencode
def fetch_company_list(keyword, max_pages=5):
base_url = 'https://www.qcc.com/webSearch'
companies = []
for page in range(1, max_pages+1):
params = {
'key': keyword,
'pageNum': page,
'pageSize': 20,
'sortType': 0
}
response = requests.get(
f'{base_url}?{urlencode(params)}',
headers=generate_headers()
)
data = response.json()
if not data.get('dataList'):
break
companies.extend(data['dataList'])
time.sleep(random.uniform(1, 3)) # 防封禁
return companies
三、数据解析与存储
1. JSON结构解析
返回数据采用嵌套JSON结构,核心字段包括:
companyName
:企业名称legalPersonName
:法人代表regCapital
:注册资本(万元)estabTime
:成立日期phone
:联系电话(需二次验证)
解析示例:
def parse_company_info(raw_data):
parsed = {
'企业名称': raw_data.get('companyName'),
'统一社会信用代码': raw_data.get('creditCode'),
'注册资本': raw_data.get('regCapital'),
'成立日期': raw_data.get('estabTime'),
'经营范围': raw_data.get('businessScope'),
'股东信息': []
}
# 解析股东信息
for shareholder in raw_data.get('shareholderList', []):
parsed['股东信息'].append({
'股东名称': shareholder.get('name'),
'认缴出资': shareholder.get('subConAm'),
'出资比例': shareholder.get('fundedRatio')
})
return parsed
2. 数据存储方案
根据使用场景选择存储方式:
- CSV存储:适合快速分析
```python
import csv
def save_to_csv(data_list, filename=’qcc_data.csv’):
with open(filename, ‘w’, newline=’’, encoding=’utf-8-sig’) as f:
writer = csv.DictWriter(f, fieldnames=data_list[0].keys())
writer.writeheader()
writer.writerows(data_list)
- **MySQL存储**:适合长期维护
```python
import pymysql
def save_to_mysql(data):
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='company_db',
charset='utf8mb4'
)
try:
with conn.cursor() as cursor:
sql = """
INSERT INTO company_info
(name, credit_code, reg_capital, estab_date, scope)
VALUES (%s, %s, %s, %s, %s)
"""
cursor.execute(sql, (
data['企业名称'],
data['统一社会信用代码'],
data['注册资本'],
data['成立日期'],
data['经营范围']
))
conn.commit()
finally:
conn.close()
四、反爬机制应对策略
1. IP代理池建设
推荐使用付费代理服务(如亮数据、芝麻代理),配合自动切换:
import requests
from proxy_pool import ProxyPool # 假设的代理池类
class AntiCrawler:
def __init__(self):
self.proxy_pool = ProxyPool()
def get_proxied_session(self):
proxy = self.proxy_pool.get_proxy()
proxies = {
'http': f'http://{proxy}',
'https': f'https://{proxy}'
}
session = requests.Session()
session.proxies.update(proxies)
return session
2. 行为模拟技术
通过Selenium模拟真实用户操作:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def selenium_search(keyword):
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
try:
driver.get('https://www.qcc.com/')
search_box = driver.find_element_by_id('searchKey')
search_box.send_keys(keyword)
search_box.send_keys(Keys.RETURN)
# 等待结果加载
time.sleep(3)
# 提取数据(需根据实际DOM结构调整)
companies = []
items = driver.find_elements_by_class_name('search-result-item')
for item in items:
companies.append({
'name': item.find_element_by_class_name('company-name').text,
'legal_person': item.find_element_by_class_name('legal-person').text
})
return companies
finally:
driver.quit()
五、合规使用建议
- 数据使用边界:仅用于个人研究或内部分析,不得用于商业竞争或非法用途
- 频率控制:单IP每小时请求不超过100次,每日不超过500次
- 数据脱敏:处理包含个人信息的字段(如法人身份证号)
- 备份机制:定期备份数据,防止账号被封禁导致数据丢失
六、完整项目示例
import requests
import json
import time
import random
from datetime import datetime
class QCCCrawler:
def __init__(self):
self.base_url = 'https://www.qcc.com/webSearch'
self.session = requests.Session()
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.qcc.com/'
}
def search_company(self, keyword, max_pages=3):
all_companies = []
for page in range(1, max_pages+1):
params = {
'key': keyword,
'pageNum': page,
'pageSize': 20
}
try:
response = self.session.get(
f'{self.base_url}?{urlencode(params)}',
headers=self.headers,
timeout=10
)
data = response.json()
if data.get('code') != 0:
print(f"请求失败: {data.get('message')}")
break
companies = data.get('dataList', [])
if not companies:
break
all_companies.extend(companies)
print(f"已获取第{page}页数据,共{len(companies)}条")
# 随机延迟
time.sleep(random.uniform(1.5, 3.5))
except Exception as e:
print(f"请求异常: {str(e)}")
continue
return all_companies
def parse_company(self, raw_data):
return {
'企业名称': raw_data.get('companyName'),
'统一社会信用代码': raw_data.get('creditCode'),
'法定代表人': raw_data.get('legalPersonName'),
'注册资本': raw_data.get('regCapital'),
'成立日期': raw_data.get('estabTime'),
'登记状态': raw_data.get('regStatus'),
'更新时间': datetime.now().strftime('%Y-%m-%d')
}
def save_to_json(self, data_list, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=2)
# 使用示例
if __name__ == '__main__':
crawler = QCCCrawler()
companies = crawler.search_company('人工智能', max_pages=2)
parsed_data = [crawler.parse_company(c) for c in companies]
crawler.save_to_json(parsed_data, 'qcc_companies.json')
print(f"共获取{len(parsed_data)}家企业信息")
七、进阶优化方向
- 分布式爬取:使用Scrapy-Redis实现多节点协作
- 增量更新:通过企业最后更新时间实现增量爬取
- 数据清洗:使用Pandas处理缺失值和异常数据
- 可视化展示:结合Pyecharts生成行业分布图表
通过系统化的技术实现和合规操作,Python爬虫可高效获取企查查的工商信息,为商业决策提供数据支撑。开发者需在技术实现与法律合规间保持平衡,建立可持续的数据获取体系。
发表评论
登录后可评论,请前往 登录 或 注册