Python高效爬取企查查工商信息指南
2025.09.18 16:01浏览量:2简介:本文详细解析如何使用Python爬取企查查工商信息,涵盖反爬机制应对、数据解析与存储,提供完整代码示例及合规建议。
一、企查查数据价值与爬取背景
企查查作为国内领先的商业信息查询平台,聚合了超过2亿家企业的工商注册、股东信息、司法风险等核心数据。这些结构化数据对于市场调研、竞品分析、风险控制等场景具有重要价值。例如金融机构可通过企业股权结构判断关联交易风险,咨询公司可基于行业数据分布制定市场策略。
传统获取方式存在三大痛点:手动查询效率低下(单企业查询需15-30秒)、批量数据获取成本高昂(API接口年费数万元)、数据维度受限(免费版仅展示基础信息)。Python爬虫技术可实现分钟级获取千家企业数据,成本降低90%以上,且支持自定义数据维度。
二、爬取技术架构设计
1. 请求头伪装技术
企查查反爬系统通过User-Agent检测、Referer校验、Cookie追踪三重机制识别爬虫。需构建动态请求头:
import randomfrom fake_useragent import UserAgentdef 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 base64import timeimport execjsdef 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 requestsfrom urllib.parse import urlencodedef 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'):breakcompanies.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存储**:适合长期维护```pythonimport pymysqldef 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 requestsfrom 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 webdriverfrom selenium.webdriver.common.keys import Keysdef 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 companiesfinally:driver.quit()
五、合规使用建议
- 数据使用边界:仅用于个人研究或内部分析,不得用于商业竞争或非法用途
- 频率控制:单IP每小时请求不超过100次,每日不超过500次
- 数据脱敏:处理包含个人信息的字段(如法人身份证号)
- 备份机制:定期备份数据,防止账号被封禁导致数据丢失
六、完整项目示例
import requestsimport jsonimport timeimport randomfrom datetime import datetimeclass 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')}")breakcompanies = data.get('dataList', [])if not companies:breakall_companies.extend(companies)print(f"已获取第{page}页数据,共{len(companies)}条")# 随机延迟time.sleep(random.uniform(1.5, 3.5))except Exception as e:print(f"请求异常: {str(e)}")continuereturn all_companiesdef 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爬虫可高效获取企查查的工商信息,为商业决策提供数据支撑。开发者需在技术实现与法律合规间保持平衡,建立可持续的数据获取体系。

发表评论
登录后可评论,请前往 登录 或 注册