返回文章列表

2026年5月19日

Python 爬虫基础实战复盘:从请求到会话保持

总结基础爬虫练习中的 GET 参数、请求头、代理、图片下载、JSON API、POST 载荷、Cookie、Session 和分页采集。

Python爬虫RequestsSessionAPI

这组基础实战围绕 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 请求会把数据放在请求体中,也就是常说的 datapayload

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. 这一阶段的知识地图

通过这些基础实战,可以把爬虫入门能力整理成一条路线:

  1. 会发送 GET 请求,理解 URL 和查询参数。
  2. 会设置请求头,知道 User-Agent 的作用。
  3. 会处理文本、JSON、二进制三类响应。
  4. 会发送 POST 请求,理解表单数据和载荷。
  5. 会使用 Cookie 和 Session 维持登录状态。
  6. 会根据分页规律批量采集页面。
  7. 会把原始数据保存到本地,为后续解析做准备。

9. 后续改进方向

当前脚本已经覆盖了爬虫基础,但如果要向工程化项目升级,可以继续补充:

  • 异常处理:请求超时、状态码异常、JSON 解析失败。
  • 频率控制:使用 time.sleep() 或任务队列降低访问压力。
  • 配置管理:账号、Cookie、代理等敏感信息不要硬编码。
  • 数据解析:用 BeautifulSoup、lxml 或 XPath 提取结构化字段。
  • 数据存储:保存到 CSV、Excel、SQLite 或 MySQL。
  • 日志记录:记录成功、失败、重试和采集进度。
  • 合规意识:遵守 robots 协议、网站条款和合理访问频率。

这组练习的价值在于把爬虫从“复制请求”推进到“理解请求”。只要能看懂浏览器 Network 面板,再结合 requests 复现请求,就已经具备了继续学习 Scrapy、异步爬虫和数据管道的基础。