1. 项目概述:AI辅助下的Python爬虫入门实战
去年帮一位做企业征信分析的朋友处理数据时,我意识到天眼查这类商业信息平台的数据采集需求远比想象中普遍。但传统爬虫开发需要面对反爬机制、页面解析等复杂问题,对新手极不友好。最近测试了几款AI编程助手后,发现它们能显著降低学习门槛——即使零基础用户,配合正确的工具链,也能在2小时内完成首个可用的企业信息采集脚本。
这个项目将展示如何用AI辅助工具快速构建天眼查爬虫。不同于传统教程,我们会重点利用AI实时生成代码、解释逻辑、调试错误的能力,让编程基础薄弱的用户也能理解每个环节。最终实现的脚本可以自动获取公司基本信息、股东构成、法律诉讼等关键数据,并以结构化格式存储。
关键提示:所有操作均在法律允许范围内进行,严格遵守天眼查robots.txt规定,单次采集间隔设置为5秒以上,仅用于个人学习目的
2. 环境配置与工具选型
2.1 Python环境快速搭建
对于Windows用户,推荐使用Microsoft Store直接安装Python 3.11:
- 打开Microsoft Store搜索"Python 3.11"
- 点击获取(默认会勾选"将Python添加到PATH")
- 安装完成后在CMD输入
python --version验证
Mac用户建议通过Homebrew安装:
brew install python@3.11 echo 'export PATH="/opt/homebrew/opt/python@3.11/bin:$PATH"' >> ~/.zshrc2.2 开发工具配置
VSCode作为首选IDE,需要安装以下扩展:
- Python官方扩展(代码补全和调试)
- Jupyter(交互式执行代码片段)
- GitHub Copilot(AI辅助编程核心工具)
实测配置要点:
- 在设置中开启"Auto Complete"和"Inline Suggest"
- 调整Copilot的响应速度为"Balanced"(设置→Extensions→Copilot)
- 安装后按Ctrl+Shift+P输入"Copilot: Login"完成身份验证
2.3 必备Python库安装
创建项目目录后,执行:
pip install requests beautifulsoup4 pandas fake-useragent各库作用说明:
- requests:网络请求核心库(比urllib更友好)
- beautifulsoup4:HTML解析神器
- pandas:数据清洗与导出
- fake-useragent:生成随机请求头规避基础反爬
3. 天眼查页面结构分析
3.1 目标数据定位
以"小米科技有限责任公司"为例(公司ID:92040300710932208K),我们需要采集:
- 工商基本信息(注册资本、成立日期等)
- 主要人员(法人、股东等)
- 分支机构
- 风险信息(法律诉讼、行政处罚等)
通过浏览器开发者工具(F12)分析发现:
- 关键数据通过异步接口加载(XHR请求)
- 数据接口需要携带Cookie和Token认证
- 分页数据采用动态参数加密
3.2 反爬机制破解方案
天眼查采用的多层防护包括:
- 请求头验证(User-Agent、Referer)
- 行为检测(鼠标轨迹、请求频率)
- 参数签名(_token等动态值)
应对策略:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': 'https://www.tianyancha.com/', 'Cookie': '你的登录Cookie' # 通过手动登录后获取 }重要提醒:切勿使用多线程/异步请求,单次采集间隔建议5-10秒,每日采集量控制在100条以内
4. AI辅助开发实战流程
4.1 用自然语言描述需求
在VSCode中新建.py文件,直接输入注释:
# 我需要一个天眼查公司详情采集脚本,要求: # 1. 输入公司ID获取基本信息 # 2. 处理JSON格式的响应数据 # 3. 将结果保存到Excel # 4. 自动处理网络异常和反爬Copilot会自动生成基础代码框架,我们在此基础上修改:
import requests import pandas as pd from fake_useragent import UserAgent def get_company_info(company_id): ua = UserAgent() headers = { 'User-Agent': ua.random, 'Referer': f'https://www.tianyancha.com/company/{company_id}' } url = f'https://www.tianyancha.com/api/v4/company/baseinfo?id={company_id}' try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() return response.json()['data'] except Exception as e: print(f"Error fetching data: {e}") return None4.2 数据解析与清洗
让AI帮助处理嵌套的JSON结构:
# 请帮我解析天眼查返回的JSON数据,提取以下字段: # 公司名称、注册资本、成立日期、统一社会信用代码 # 并转换为Pandas DataFrame格式 def parse_company_data(json_data): if not json_data: return pd.DataFrame() base_info = json_data.get('baseInfo', {}) result = { '公司名称': base_info.get('name'), '注册资本': f"{base_info.get('regCapital')} {base_info.get('regCapitalCurrency', '人民币')}", '成立日期': base_info.get('estiblishTime'), '信用代码': base_info.get('creditCode') } return pd.DataFrame([result])4.3 异常处理增强
通过对话式交互让AI补充健壮性代码:
# 请为爬虫添加以下异常处理: # 1. 代理失败自动重试 # 2. 验证码触发时暂停操作 # 3. 数据格式错误时记录日志 RETRY_MAX = 3 PROXIES = {'http': 'http://你的代理IP:端口'} def safe_request(url, headers, retry=0): if retry >= RETRY_MAX: raise Exception("Max retries exceeded") try: response = requests.get(url, headers=headers, proxies=PROXIES, timeout=15) if '验证码' in response.text: input("请手动处理验证码后按回车继续...") return safe_request(url, headers, retry+1) return response except requests.exceptions.RequestException as e: print(f"Request failed (attempt {retry+1}): {e}") time.sleep(5 * (retry + 1)) return safe_request(url, headers, retry+1)5. 完整脚本组装与优化
5.1 主流程实现
整合各功能模块:
import time from tqdm import tqdm # 进度条显示 def main(): company_ids = ['92040300710932208K'] # 示例公司ID all_data = [] for cid in tqdm(company_ids): raw_data = get_company_info(cid) df = parse_company_data(raw_data) if not df.empty: all_data.append(df) time.sleep(8) # 遵守爬虫礼仪 final_df = pd.concat(all_data, ignore_index=True) final_df.to_excel('tianyancha_data.xlsx', index=False) print(f"成功保存{len(all_data)}条数据")5.2 参数调优建议
通过AI分析得到的性能优化点:
- 请求超时设置为10-15秒(兼顾成功率和效率)
- 随机延迟区间设为5-10秒(避免固定间隔被识别)
- 使用会话对象(Session)保持连接(降低TCP握手开销)
优化后的请求代码:
session = requests.Session() adapter = requests.adapters.HTTPAdapter( pool_connections=10, pool_maxsize=10, max_retries=3 ) session.mount('http://', adapter) session.mount('https://', adapter) def optimized_request(url): delay = random.uniform(5, 10) time.sleep(delay) return session.get(url, headers=generate_headers())6. 常见问题与解决方案
6.1 验证码触发应对
当出现"verify.tianyancha.com"重定向时:
- 立即暂停程序运行
- 手动在浏览器完成验证码验证
- 更新Cookie后再继续运行
- 考虑使用付费代理IP(建议选择高匿住宅代理)
6.2 数据缺失处理
典型场景及解决方法:
| 问题现象 | 可能原因 | 解决方案 | |-------------------------|--------------------------|----------------------------| | 注册资本显示为null | 数据接口版本变更 | 检查API路径是否为v4最新版 | | 股东信息列表为空 | 需要调用单独接口 | 查找'/api/v4/holder'类接口 | | 返回数据包含HTML代码 | 触发反爬被重定向 | 更换UserAgent和IP |6.3 效率提升技巧
- 使用
concurrent.futures实现受限并发(建议线程数≤3) - 优先采集必要字段,避免全量数据请求
- 对稳定接口使用本地缓存(示例代码):
from diskcache import Cache cache = Cache('tianyancha_cache') @cache.memoize(expire=86400) def cached_request(url): return requests.get(url).json()7. 法律合规与数据使用
7.1 robots.txt检查
天眼查当前robots.txt关键限制:
Disallow: /search/ Disallow: /company/ Disallow: /vip/解读说明:
- 禁止爬取搜索功能相关页面
- 公司详情页原则上不允许爬取
- 实际可通过API接口获取数据(但需控制频率)
7.2 数据使用建议
合法使用边界:
- 禁止商业性批量采集(需购买官方API)
- 允许少量数据用于学术研究
- 个人学习用途需删除敏感字段(如联系方式)
数据脱敏示例:
def anonymize_data(df): sensitive_cols = ['phone', 'email', 'idNumber'] for col in sensitive_cols: if col in df.columns: df[col] = 'REDACTED' return df这个项目的核心价值在于展示AI如何降低编程学习曲线——当遇到不懂的代码时,你可以直接选中代码按Ctrl+I召唤Copilot解释;当需要新功能时,用自然语言描述就能生成可用代码框架。这种即时反馈的学习方式,让零基础用户能在解决实际问题的过程中掌握Python核心概念。