数据采集基础:Requests库使用、API认证机制、数据抓取策略、反爬虫应对

数据采集,说白了就是跟网站「要数据」。

我做了这么多年社交媒体挖掘,最深的体会是:采集这步要是跪了,后面分析再牛也白搭。今天咱们就把这块硬骨头啃下来。

2.1 Requests库:你的数据搬运工

Python的Requests库,是我用得最多的HTTP工具。没有之一。

为什么?因为它够简单,够直接。

核心用法就三行:

import requests

# GET请求,拿数据
resp = requests.get('https://api.weibo.com/2/statuses/public_timeline.json')
print(resp.json())  # 直接解析JSON

# POST请求,提交数据
payload = {'user': 'admin', 'pass': '123456'}
resp = requests.post('https://example.com/login', data=payload)

嗯,这里要注意:resp.text 返回的是字符串,resp.content 返回的是字节流。我刚开始做采集时,经常搞混这两个,导致中文乱码。后来养成了习惯——拿不准就用 resp.encoding = 'utf-8' 强制指定编码。

我的小技巧:写采集脚本时,先加个 print(resp.status_code) 看看状态码。200 是正常,403 说明被拦了,500 是服务器炸了。别一上来就解析数据,先确认数据拿到了再说。

2.2 API认证机制:你不是谁都能见的

社交媒体平台不是菜市场,谁都能进。它们有门禁——API认证。

最常见的三种认证方式,我一个个说:

认证方式 原理 适用场景
API Key 简单令牌,拼在URL里 小规模、低敏感数据
OAuth 2.0 授权码+令牌,有有效期 主流社交媒体(微博、Twitter)
JWT 自包含令牌,可携带用户信息 企业级API、微服务

我个人最常用的是OAuth 2.0。为什么?因为微博、微信、抖音全用这套。

举个例子,微博API的认证流程:

# 第一步:获取授权码(用户手动授权)
# 第二步:用授权码换access_token
import requests

url = 'https://api.weibo.com/oauth2/access_token'
data = {
    'client_id': '你的App Key',
    'client_secret': '你的App Secret',
    'grant_type': 'authorization_code',
    'code': '用户授权后拿到的code',
    'redirect_uri': '你的回调地址'
}
resp = requests.post(url, data=data)
token_info = resp.json()
access_token = token_info['access_token']  # 这个就是通行证

# 第三步:带着token去请求数据
headers = {'Authorization': f'Bearer {access_token}'}
resp = requests.get('https://api.weibo.com/2/statuses/friends_timeline.json', headers=headers)

避坑指南:我曾经遇到过access_token过期导致采集中断的情况。那次跑了三天三夜的脚本,凌晨四点断了,数据只采了一半。后来我学乖了——每次请求前先检查token有效期,快过期了自动刷新。代码里加个定时器,省心多了。

2.3 数据抓取策略:别像个愣头青

数据抓取不是「发请求-拿数据」这么简单。你想想看,如果每个采集器都无脑狂刷,平台早崩了。

我总结了一套「绅士采集法」:

  • 控制频率:每次请求间隔至少1秒。我习惯用 time.sleep(random.uniform(1, 3)),随机延时,更像人类行为。
  • 设置User-Agent:别用默认的Python-requests。伪装成Chrome浏览器:headers = {'User-Agent': 'Mozilla/5.0...'}
  • 分页策略:社交媒体数据是分页的。微博用since_id,Twitter用cursor。别傻乎乎地page=1,2,3... 有些平台会封这种暴力翻页。
  • 错误重试:网络波动很正常。我一般重试3次,每次间隔递增(1秒、3秒、9秒)。

核心原则:让服务器觉得你是个正常用户,而不是爬虫。

2.4 反爬虫应对:道高一尺,魔高一丈

平台也不是吃素的。它们有各种反爬手段。我这些年跟反爬虫斗智斗勇,总结了几类常见情况:

2.4.1 IP封禁

最粗暴的反爬。一个IP短时间内请求太多,直接拉黑。

应对:代理IP池。我习惯用付费代理,质量稳定。免费代理?说实话,踩坑概率太大,不推荐。

proxies = {
    'http': 'http://你的代理IP:端口',
    'https': 'https://你的代理IP:端口'
}
resp = requests.get(url, proxies=proxies, timeout=5)

2.4.2 请求头校验

平台会检查Referer、Origin、Cookie等字段。缺了某个字段,直接返回403。

应对:用浏览器开发者工具(F12)抓包,把真实请求的headers全部复制过来。我一般用 requests.Session() 保持会话,自动管理Cookie。

2.4.3 动态渲染

现在很多社交媒体用JavaScript渲染数据。直接请求HTML拿不到内容。

应对:上Selenium或Playwright。模拟真实浏览器,等JS执行完再抓数据。不过速度会慢很多,我一般只在万不得已时才用。

2.4.4 验证码

最头疼的反爬。滑块验证、文字识别、图形验证...

应对:说实话,没有100%的解决方案。我个人的做法是:降低采集频率,让行为更像人类。如果还是触发验证码,那就换IP、换账号、换设备指纹。实在不行,接入打码平台(但成本高)。

我的经验:反爬虫的本质是「成本博弈」。平台防你的成本,和你绕过的成本。如果你的数据价值足够高,那就值得投入更好的工具。如果只是练手项目,用免费代理+低频率就够了。

知识体系总览

下面这张图,是我梳理的本章核心逻辑。建议保存下来,写代码时对照着看:

数据采集基础:核心知识体系 数据采集 Requests库 GET/POST/编码/会话 API认证机制 API Key/OAuth/JWT 数据抓取策略 频率控制/分页/重试 反爬虫应对 IP代理/请求头/动态渲染 核心原则:像人类一样采集

这张图把四个核心模块串起来了。你写代码时,遇到问题就回来看看——是Requests用错了?还是认证没搞定?还是被反爬了?定位问题,对症下药。

最后说一句:数据采集不是技术活,是耐心活。我见过太多人一上来就想抓百万条数据,结果第一天就被封了。慢慢来,稳着来,数据总会有的。


专注资料整理