1. 项目概述
作为一名长期从事数据采集工作的开发者,我经常需要从各类商业平台获取企业数据。天眼查作为国内知名的企业信息查询平台,包含了大量有价值的工商数据。但对于新手来说,直接从这类平台采集数据存在一定技术门槛。
最近我发现,结合AI工具可以大幅降低Python爬虫的学习成本。本文将分享一个完整的实战案例:如何使用Python+Selenium+AI工具链从天眼查采集企业数据。这个方案特别适合没有编程基础但急需获取商业数据的市场分析人员、创业者或学术研究者。
2. 环境准备与工具链搭建
2.1 ChromeDriver安装与配置
ChromeDriver是Selenium控制Chrome浏览器的桥梁,安装时需要注意版本匹配问题:
-
查看Chrome浏览器版本:
- 在Chrome地址栏输入:chrome://settings/help
- 或点击右上角菜单 > 帮助 > 关于Google Chrome
-
下载对应版本的ChromeDriver:
- 官方下载地址:https://chromedriver.chromium.org/downloads
- 对于Chrome 115+版本,需要下载"Chrome 115及更高版"
重要提示:Chrome和ChromeDriver的主版本号必须完全一致,否则会出现兼容性问题。比如Chrome 120.0.6099.199必须搭配ChromeDriver 120.0.6099.x
- 配置环境变量:
将下载的chromedriver.exe放在固定目录(如D:\webdriver),并将该目录添加到系统PATH环境变量中。这样Python代码中就不需要写绝对路径了。
2.2 Python环境配置
推荐使用Anaconda创建独立的Python环境:
bash复制conda create -n tianyancha python=3.9
conda activate tianyancha
pip install selenium beautifulsoup4 pandas
核心库说明:
- selenium:浏览器自动化工具
- beautifulsoup4:HTML解析库
- pandas:数据处理与分析
3. 天眼查爬虫核心实现
3.1 初始化WebDriver
python复制from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 无头模式配置(可选)
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)
关键参数说明:
disable-blink-features=AutomationControlled:隐藏自动化测试特征excludeSwitches:禁用开发者模式警告- 无头模式适合服务器环境,但调试时建议关闭
3.2 关键词搜索实现
天眼查的搜索接口通过URL参数传递关键词:
python复制def search_companies(keyword):
search_url = f"https://www.tianyancha.com/search?key={keyword}"
driver.get(search_url)
# 显式等待搜索结果加载
WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.CLASS_NAME, "index_alink__zcia5"))
)
# 隐式等待确保数据完全加载
time.sleep(2)
return driver.page_source
实际测试发现,天眼查对频繁请求有严格限制,建议:
- 每个关键词搜索间隔5-10秒
- 使用随机User-Agent
- 必要时添加代理IP
3.3 企业详情页数据提取
通过BeautifulSoup解析页面元素:
python复制from bs4 import BeautifulSoup
def parse_company_list(html):
soup = BeautifulSoup(html, 'html.parser')
company_list = []
for item in soup.select('.index_alink__zcia5.link-click'):
company = {
'name': item.select_one('.index_name__G5B5p').text,
'legal_rep': item.select_one('.index_legalRepresentative__2zQcY').text,
'reg_capital': item.select_one('.index_regCapital__2PEeW').text,
'status': item.select_one('.index_status__3QzVZ').text,
'detail_url': item['href']
}
company_list.append(company)
return company_list
4. AI辅助开发实战技巧
4.1 让AI生成XPath定位器
当手动定位元素困难时,可以:
- 截图目标区域
- 将HTML片段和需求描述提供给AI
- 示例Prompt:
"请根据以下HTML代码生成能定位'注册资本'元素的XPath:html复制要求:使用class属性定位"<div class='index_regCapital__2PEeW'>500万人民币</div>
AI通常会返回:
python复制//div[@class='index_regCapital__2PEeW']
4.2 自动处理反爬机制
天眼查常见的反爬措施及AI解决方案:
-
验证码识别:
- 提供验证码截图给AI视觉模型
- 使用OCR API自动识别
-
行为检测:
python复制# 模拟人类操作 def human_like_action(element): action = webdriver.ActionChains(driver) action.move_to_element(element).pause(0.5).click().perform() -
请求频率控制:
python复制import random time.sleep(random.uniform(1, 3)) # 随机延迟
4.3 数据清洗与格式化
原始数据往往需要后处理:
python复制def clean_data(raw_text):
# 去除特殊字符
cleaned = re.sub(r'[\n\t\r]', '', raw_text)
# 转换金额格式
if '万' in cleaned:
return float(cleaned.replace('万', '')) * 10000
return cleaned
可以让AI根据样本数据自动生成清洗规则。
5. 完整项目架构
建议采用模块化设计:
code复制tianyancha_crawler/
├── main.py # 主程序
├── config.py # 配置文件
├── utils/
│ ├── browser.py # 浏览器操作
│ ├── parser.py # 数据解析
│ └── storage.py # 数据存储
└── data/ # 存储结果
核心逻辑流程:
- 初始化配置(关键词、过滤条件等)
- 启动浏览器实例
- 执行搜索并获取列表页
- 提取企业详情页URL
- 逐个访问详情页并解析数据
- 存储结构化结果(CSV/Excel/数据库)
6. 常见问题排查
6.1 ElementNotInteractableException错误
典型场景:元素被遮挡无法点击
解决方案:
python复制driver.execute_script("arguments[0].click();", element)
6.2 StaleElementReferenceException错误
原因:DOM更新导致元素引用失效
解决方法:
python复制WebDriverWait(driver, 10).until(
EC.staleness_of(old_element)
)
6.3 数据提取不全问题
检查步骤:
- 确认页面是否完全加载(等待AJAX完成)
- 验证XPath/CSS选择器是否准确
- 检查是否有iframe嵌套
7. 高级技巧与优化建议
7.1 分布式爬虫架构
对于大规模采集:
- 使用Scrapy-Redis实现分布式
- 结合Celery进行任务队列管理
- 采用Rotating Proxy解决IP限制
7.2 数据去重方案
python复制import hashlib
def get_fingerprint(item):
s = f"{item['name']}{item['reg_no']}"
return hashlib.md5(s.encode()).hexdigest()
7.3 自动化监控系统
实现功能:
- 异常自动报警(邮件/短信)
- 自动恢复机制
- 数据质量校验
8. 法律与道德注意事项
- 严格遵守天眼查的robots.txt协议
- 控制请求频率,避免对目标服务器造成负担
- 采集的数据仅用于合法用途
- 商业使用前务必咨询法律意见
这个项目最让我惊喜的是AI在解决具体问题时的效率。比如当遇到动态加载问题时,只需把错误信息和页面结构描述清楚,AI就能快速给出可行的解决方案。对于没有计算机背景的同事,他们现在也能通过自然语言描述需求,让AI生成可用的爬虫代码框架。