简介:本文通过完整案例解析Python爬取工商信息的全流程,涵盖数据源选择、反爬策略应对、数据清洗与存储等核心环节,提供可复用的代码框架与合规操作指南。
工商信息作为企业运营的核心数据,包含企业注册信息、股东结构、行政处罚等关键字段。在金融风控、供应链管理、市场调研等领域,实时获取工商数据可显著提升决策效率。例如,某供应链金融平台通过每日监控核心企业股权变更信息,成功预警3起潜在担保风险事件。
根据《网络安全法》和《数据安全法》,公开工商信息可依法获取,但需注意:1)避免高频请求触发反爬机制;2)不得存储敏感个人信息;3)数据使用需符合原始用途。建议优先选择政府公开数据平台或取得ICP备案的第三方数据服务商。
# 基础爬虫依赖requests==2.28.1beautifulsoup4==4.11.1# 反爬处理selenium==4.1.0fake_useragent==1.1.1# 数据处理pandas==1.4.3openpyxl==3.0.10
以浙江省企业信用信息公示系统为例,其特点包括:
import requestsfrom fake_useragent import UserAgentimport jsonimport timeimport randomclass BusinessInfoCrawler:def __init__(self):self.base_url = "http://zj.gsxt.gov.cn/affiche/getList"self.ua = UserAgent()self.proxies = self._load_proxies() # 代理IP池def _get_random_header(self):return {'User-Agent': self.ua.random,'Referer': 'http://zj.gsxt.gov.cn/','X-Requested-With': 'XMLHttpRequest'}def fetch_page(self, page_num):params = {'pageNum': page_num,'pageSize': 20,'keyword': '','province': '330000'}try:proxy = random.choice(self.proxies)response = requests.get(self.base_url,params=params,headers=self._get_random_header(),proxies=proxy,timeout=10)if response.status_code == 200:data = json.loads(response.text[14:-1]) # 处理JSONPreturn data['list']return []except Exception as e:print(f"Request failed: {e}")time.sleep(random.uniform(5, 10))return self.fetch_page(page_num) # 重试机制def parse_record(self, record):return {'company_name': record['entName'],'reg_no': record['regNo'],'legal_person': record['legalPersonName'],'reg_capital': record['regCap'],'status': record['entStatus'],'update_date': record['updateDate']}
import pandas as pdfrom datetime import datetimedef clean_business_data(raw_data):df = pd.DataFrame(raw_data)# 金额单位转换(万元→元)df['reg_capital'] = df['reg_capital'].apply(lambda x: float(x)*10000 if str(x).replace('.','').isdigit() else 0)# 日期标准化df['update_date'] = pd.to_datetime(df['update_date'],errors='coerce',format='%Y-%m-%d')# 状态码映射status_map = {'1': '存续','2': '吊销','3': '注销','4': '迁出'}df['status'] = df['status'].map(status_map)return df
def calculate_risk_score(row):score = 0# 注册资金实缴比例if row['paid_cap'] and row['reg_cap']:ratio = row['paid_cap'] / row['reg_cap']score += 20 if ratio < 0.3 else 0# 变更频率if pd.notnull(row['change_count']):score += 15 if row['change_count'] > 3 else 0# 行政处罚score += 30 if row['penalty_count'] > 0 else 0return min(score, 100) # 风险分上限
本案例完整代码包含:
通过系统化实施上述方案,某金融科技公司成功将工商数据获取成本降低70%,同时数据准确率提升至98.6%。建议开发者在实际部署前进行小规模测试,并根据目标网站的反爬策略动态调整技术方案。