1. 数据采集基础:数据源分类、采集策略、爬虫与API基础
数据采集,说白了就是搞清楚「数据从哪来、怎么拿、拿多少」。我刚开始做数据工程时,以为采集就是写个爬虫跑一跑。后来发现,选错数据源、用错策略,后面清洗、存储全白搭。这一节咱们把地基打牢。
1.1 数据源分类:你的数据到底在哪?
我个人习惯把数据源分成三大类。你想想看,不管业务多复杂,数据来源基本逃不出这三个圈子。
| 分类 | 典型例子 | 采集难度 | 更新频率 |
|---|---|---|---|
| 结构化数据源 | 关系型数据库(MySQL、PostgreSQL)、CSV、Excel | 低 | 定时/实时 |
| 半结构化数据源 | JSON/XML API、日志文件、NoSQL(MongoDB) | 中 | 流式/批量 |
| 非结构化数据源 | 网页HTML、图片、PDF、视频流 | 高 | 按需/持续 |
我的经验: 别一上来就想着爬网页。先问问业务方「有没有数据库直连权限?有没有现成API?」——能走API就别爬,能查库就别解析HTML。我在项目中见过太多人绕远路了。
1.2 采集策略:全量、增量、还是流式?
选策略之前,先回答三个问题:数据量多大?能容忍多久延迟?源端会不会删数据?
- 全量采集:第一次跑,或者数据量很小(百万级以下)。直接一把梭,简单粗暴。
- 增量采集:日常跑。只拿新增或变化的数据。需要源端有「时间戳」或「自增ID」做标记。
- 流式采集:实时场景。用Kafka、Debezium监听数据库binlog,或者Webhook回调。延迟秒级。
避坑指南: 我曾经接手过一个项目,全量采集每天跑一次,数据量从500万涨到5亿,跑一次要6小时。后来改成增量+每周全量对账,时间降到15分钟。记住:全量采集不是银弹,数据量大了必须切增量。
1.3 爬虫基础:君子协议与反爬
爬虫不是「想爬就爬」。我个人习惯先看 robots.txt,这是最基本的礼貌。比如 https://example.com/robots.txt 里写了 Disallow: /private/,那就别碰。
一个简单的爬虫流程长这样:
import requests
from bs4 import BeautifulSoup
url = "https://example.com/public-data"
headers = {"User-Agent": "Mozilla/5.0 (compatible; DataCourse/1.0)"}
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, "html.parser")
# 提取所有表格行
rows = soup.select("table.data tr")
for row in rows:
cells = row.find_all("td")
if cells:
print([cell.get_text(strip=True) for cell in cells])
嗯,这里要注意:User-Agent 一定要伪装成正常浏览器。我见过有人用默认的 python-requests,直接被封IP。另外,加个 time.sleep(1) 控制频率,别把人家服务器打挂了。
核心原则: 爬虫是「模拟人类访问」,不是「攻击服务器」。尊重数据源,控制频率,遵守协议。
1.4 API基础:RESTful与认证
相比爬虫,我更推荐用API。API是数据源主动给你的,结构清晰,稳定性高。现在主流是RESTful API,说白了就是通过HTTP动词(GET/POST/PUT/DELETE)操作资源。
举个调用GitHub API的例子:
import requests
url = "https://api.github.com/repos/octocat/Hello-World"
headers = {"Accept": "application/vnd.github.v3+json"}
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
data = resp.json()
print(f"仓库名: {data['name']}")
print(f"星标数: {data['stargazers_count']}")
else:
print(f"请求失败: {resp.status_code}")
API调用常见的坑有三个:
- 限流(Rate Limit):很多API每小时只能请求几百次。超了会返回429。我习惯在代码里加个重试逻辑,等几秒再试。
- 认证:用API Key或Token。别把Key硬编码在代码里,用环境变量。
- 分页:一次请求只返回一页数据。记得检查响应头里的
Link字段,或者用?page=1&per_page=100参数遍历。
1.5 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作数据采集的「导航地图」。
1.6 本章小结
数据采集不是「拿到数据就行」,而是「用对的方式拿到对的数据」。我个人总结了三条铁律:
- 先分类,再动手——搞清楚数据是结构化的还是非结构化的,决定用什么工具。
- 策略比工具重要——全量、增量、流式,选错了后面全白干。
- 尊重数据源——爬虫守规矩,API看文档,数据库问权限。
嗯,这一章的内容就到这。记住这些基础,后面讲具体采集工具和预处理时,你会发现自己已经站在了正确的起跑线上。