第三章 数据采集策略:公开数据源、API与爬虫技术选型
做产业链图谱,最头疼的是什么?
不是分析模型,不是可视化工具——是数据。我见过太多团队,模型建得漂漂亮亮,结果数据一塌糊涂,最后全白干。说白了,数据采集是整条产业链分析的根基。根基不稳,上面盖什么都是危楼。
3.1 公开数据源:招股书、行业报告、新闻
公开数据源,是我个人最推荐优先挖掘的。为什么?因为合规、稳定、可追溯。你想想看,做产业链分析,如果数据来源说不清楚,谁敢信你的结论?
3.1.1 招股书
招股书是宝藏。我在项目中遇到过,某家新能源企业的招股书里,直接披露了前五大供应商的采购金额和占比。这种数据,你在任何行业报告里都找不到。
| 数据源 | 关键字段 | 获取方式 |
|---|---|---|
| 招股书(IPO) | 供应商、客户、成本结构、产能 | 证监会官网、巨潮资讯网 |
| 年报/半年报 | 营收构成、研发投入、前五大客户 | 公司官网、上交所/深交所 |
| 债券募集说明书 | 资产负债、现金流、项目投资 | 中国债券信息网 |
我的习惯: 招股书里「业务与技术」章节,直接复制出来做关键词提取。我曾经用这个方法,半小时就理清了一条锂电池产业链的上下游关系。
3.1.2 行业报告
行业报告的问题在于——太贵。一份靠谱的券商研报,动辄几千块。但也不是没办法。
- 免费渠道: 东方财富、同花顺的研报平台,可以看摘要
- 付费渠道: 万得、彭博,数据全但贵
- 灰色渠道: 嗯,这个我不建议碰,合规风险太高
我建议的做法是:先用免费渠道做初步筛选,确定有价值的报告后再考虑付费。别一上来就买买买,钱花完了数据还没用上。
3.1.3 新闻与公告
新闻数据的特点是时效性强,但噪音大。你想想看,一条「某公司签订战略合作协议」的新闻,可能只是炒作,也可能是真的大单。
避坑指南: 我曾经因为一条新闻,误判了某家公司的产能扩张节奏。后来发现,那只是意向协议,根本没落地。所以,新闻数据一定要交叉验证。
3.2 API数据获取
API是效率最高的方式。没有之一。手动下载数据?那是上个世纪的做法了。
3.2.1 常用API接口
| 平台 | 接口类型 | 免费额度 | 适用场景 |
|---|---|---|---|
| 天眼查/企查查 | 企业信息、股权结构 | 有限(每天几十次) | 产业链节点企业查询 |
| 万得(Wind) | 金融数据、行业数据 | 无免费 | 上市公司财务数据 |
| 百度地图/高德 | 地理位置、POI | 每日有免费额度 | 产业园区、工厂分布 |
| 微博/微信 | 社交媒体数据 | 有限 | 舆情监测、品牌热度 |
3.2.2 API调用示例
以天眼查为例,获取企业基本信息:
import requests
import json
# 天眼查API配置
api_key = "your_api_key_here"
url = "https://open.api.tianyancha.com/services/open/ic/baseinfo/normal"
headers = {
"Authorization": api_key,
"Content-Type": "application/json"
}
params = {
"keyword": "宁德时代",
"pageNum": 1,
"pageSize": 10
}
response = requests.get(url, headers=headers, params=params)
data = response.json()
# 提取关键信息
if data.get("result"):
for item in data["result"]:
print(f"企业名称: {item['name']}")
print(f"法定代表人: {item['legalPersonName']}")
print(f"注册资本: {item['regCapital']}")
print(f"成立日期: {item['estiblishTime']}")
print("---")
核心要点: API调用一定要做异常处理。网络波动、接口限流、参数错误,这些都是家常便饭。我习惯在代码里加个重试机制,最多重试3次,每次间隔2秒。
3.3 爬虫技术选型
爬虫,是最后的手段。为什么这么说?因为爬虫有法律风险、技术门槛、维护成本。但有些数据,不用爬虫就是拿不到。
3.3.1 技术选型对比
| 技术方案 | 适用场景 | 学习成本 | 反爬能力 | 维护成本 |
|---|---|---|---|---|
| Requests + BeautifulSoup | 静态页面、简单列表页 | 低 | 弱 | 低 |
| Scrapy | 大规模、多页面爬取 | 中 | 中 | 中 |
| Selenium/Playwright | 动态渲染、JS加载页面 | 中高 | 强 | 高 |
| Puppeteer (Node.js) | 复杂交互、截图 | 高 | 强 | 高 |
3.3.2 我的选型原则
说白了,就一句话:能用简单的,就别用复杂的。
- 如果页面是静态HTML,直接用Requests + BeautifulSoup,半小时搞定
- 如果页面有简单的AJAX加载,试试直接调接口,比爬页面快10倍
- 如果页面是React/Vue渲染的,才考虑Selenium或Playwright
我曾经踩过的坑: 有一次为了爬一个动态页面,我用了Selenium。结果页面加载太慢,一个页面要等5秒。后来发现,那个页面其实有个隐藏的JSON接口,直接调接口1秒就拿到了数据。所以,先分析网络请求,再决定技术方案。
3.3.3 反爬应对策略
现在的网站,反爬手段越来越多了。我总结了几条实用策略:
- User-Agent轮换: 别用一个固定的UA,容易被识别
- IP代理池: 免费代理不稳定,付费的也不贵
- 请求频率控制: 加个随机延时,别太规律
- Cookie管理: 有些网站需要登录后的Cookie
- 验证码处理: 简单的可以用OCR,复杂的建议用打码平台
小技巧: 我习惯在爬虫代码里加个日志,记录每次请求的状态码和响应时间。这样出了问题,能快速定位是网络问题还是反爬问题。
3.4 数据采集策略总览
最后,我用一张图来总结本章的核心逻辑。这张图是我自己画的,希望能帮你理清思路。
这张图的核心逻辑是:先确定数据源,再选择采集方式,最后匹配技术方案。别搞反了。我见过有人先学了Scrapy,然后什么数据都用Scrapy爬,结果招股书明明可以直接下载PDF,他非要去爬网页——这不是技术选型,这是炫技。
最后说一句: 数据采集不是一锤子买卖。产业链数据是动态变化的,今天采集的数据,明天可能就过期了。所以,一定要建立数据更新的机制。我个人的做法是:每周跑一次增量采集,每月做一次全量更新。这样既能保证时效性,又不会浪费太多资源。
公众号:蓝海资料掘金营,微信deep3321