2026年5月19日
Python 爬虫基础实战复盘:从请求到会话保持
总结基础爬虫练习中的 GET 参数、请求头、代理、图片下载、JSON API、POST 载荷、Cookie、Session 和分页采集。
这组基础实战围绕 requests 展开,练习目标不是追求复杂框架,而是先把一次 HTTP 请求从发起到解析的关键环节拆清楚:请求地址、请求头、参数、载荷、响应格式、登录状态和分页采集。
1. GET 请求、参数和请求头
最基础的爬虫请求通常由三部分组成:
url:目标地址。headers:请求头,常见的是User-Agent。params:查询参数,也就是 URL 中?key=value这一类内容。
例如贴吧搜索这类页面,可以把关键词放进 params,让 requests 自动拼接 URL:
import requests
url = "https://tieba.baidu.com/f"
headers = {
"user-agent": "Mozilla/5.0 ..."
}
params = {
"kw": "荒野乱斗"
}
response = requests.get(url, headers=headers, params=params)
print(response.status_code)
print(response.text)
这个练习的重点是理解:浏览器地址栏里的查询参数,在代码里可以拆成字典来维护。这样后续修改关键词、页码、筛选条件会更方便。
2. 代理 IP 的作用
基础框架里也练习了 proxies 参数:
proxies = {
"http": "代理地址:端口"
}
response = requests.get(url, headers=headers, params=params, proxies=proxies)
代理的作用是让请求通过另一个网络出口访问目标站点。它常用于测试网络连通性、模拟不同访问来源,或者应对访问频率限制。
不过代理不是越多越好,免费代理经常失效,也可能带来安全风险。正式项目里更重要的是控制访问频率、处理失败重试,并遵守目标网站规则。
3. 图片和二进制内容下载
下载图片时不能使用 response.text,而应该使用 response.content。因为图片不是文本,而是二进制数据。
import requests
img_url = "https://www.baidu.com/img/example.png"
response = requests.get(img_url)
with open("baidu-logo.jpg", "wb") as file:
file.write(response.content)
这里的关键点是文件打开模式:
w:写文本。wb:写二进制。
图片、视频、压缩包等资源都应该使用二进制方式保存。
4. JSON API 数据采集
B 站热门数据实战体现了另一个常见场景:页面本身可能很复杂,但数据来自后端 API。
这类接口返回的一般是 JSON,因此可以直接用:
data = response.json()
然后根据接口结构提取字段,例如标题、分类、UP 主、播放量、点赞数、收藏数等。
相比解析 HTML,JSON API 的优点是结构更清晰,字段更稳定。爬虫学习时应该优先观察浏览器开发者工具里的 Network 面板,判断目标数据是来自 HTML 还是 API。
5. POST 请求、载荷和 Cookie
百度翻译实战练习了 POST 请求。GET 请求通常把参数放在 URL 里,而 POST 请求会把数据放在请求体中,也就是常说的 data 或 payload。
data = {
"query": "香蕉",
"from": "zh",
"to": "en"
}
response = requests.post(url, headers=headers, data=data)
这个练习还涉及 Cookie。Cookie 常用于保存用户状态、访问标识、风控参数等。复制浏览器 Cookie 可以帮助理解请求过程,但不适合作为长期方案,因为 Cookie 会过期,也可能包含敏感信息。
更好的做法是:
- 只保留必要请求头。
- 避免把真实 Cookie 写进代码。
- 如果必须使用敏感配置,用环境变量或单独配置文件管理。
6. Session 登录和状态保持
药智网和 17k 小说网练习了登录请求。登录类场景的核心是会话保持。
requests.session() 会创建一个会话对象,它可以自动保存服务端返回的 Cookie。登录成功后,再用同一个 session 请求其他页面,就能带上登录状态。
import requests
session = requests.session()
login_data = {
"username": "你的账号",
"password": "你的密码"
}
session.post(login_url, headers=headers, data=login_data)
html = session.get(home_url, headers=headers)
这里最重要的不是“如何登录某个网站”,而是理解浏览器登录的本质:提交账号密码后,服务端通过 Cookie 或 Token 识别后续请求属于同一个用户。
需要注意的是,账号、密码、Cookie 都属于敏感信息,不应该提交到公开仓库,也不应该直接写进博客文章。
7. 分页页面采集
链家网实战练习了分页 URL 的构造。很多网站的分页都有规律,例如:
/pg1/
/pg2/
/pg3/
代码里可以用循环生成 URL:
for page in range(1, 6):
url = f"https://example.com/list/pg{page}/"
response = requests.get(url, headers=headers)
这个练习把多个页面的 HTML 保存到本地文件中,适合后续再做解析练习,比如使用 BeautifulSoup、lxml 或正则提取房源标题、价格、区域等字段。
8. 这一阶段的知识地图
通过这些基础实战,可以把爬虫入门能力整理成一条路线:
- 会发送 GET 请求,理解 URL 和查询参数。
- 会设置请求头,知道
User-Agent的作用。 - 会处理文本、JSON、二进制三类响应。
- 会发送 POST 请求,理解表单数据和载荷。
- 会使用 Cookie 和 Session 维持登录状态。
- 会根据分页规律批量采集页面。
- 会把原始数据保存到本地,为后续解析做准备。
9. 后续改进方向
当前脚本已经覆盖了爬虫基础,但如果要向工程化项目升级,可以继续补充:
- 异常处理:请求超时、状态码异常、JSON 解析失败。
- 频率控制:使用
time.sleep()或任务队列降低访问压力。 - 配置管理:账号、Cookie、代理等敏感信息不要硬编码。
- 数据解析:用 BeautifulSoup、lxml 或 XPath 提取结构化字段。
- 数据存储:保存到 CSV、Excel、SQLite 或 MySQL。
- 日志记录:记录成功、失败、重试和采集进度。
- 合规意识:遵守 robots 协议、网站条款和合理访问频率。
这组练习的价值在于把爬虫从“复制请求”推进到“理解请求”。只要能看懂浏览器 Network 面板,再结合 requests 复现请求,就已经具备了继续学习 Scrapy、异步爬虫和数据管道的基础。