跳转至

爬虫入门:边界、流程与请求礼仪

网页爬虫的基本工作是:请求公开资源 → 解析响应 → 提取所需字段 → 保存结果。技术上的“能拿到”不等于可以任意使用。开始写代码前,先确认目标站点的服务条款、数据使用规则,以及数据中是否包含个人信息或其他受保护内容。

1. 一次规范抓取的最小流程

  1. 明确数据用途、字段和来源,只抓取完成目标所需的数据。
  2. 查阅站点条款,并读取 https://目标域名/robots.txt
  3. 为爬虫设置清晰的 User-Agent,不要伪装成浏览器或绕过访问控制。
  4. 使用低频、可控的请求;发生错误时停止或退避,而不是并发重试。
  5. 校验响应状态和内容类型,再解析与保存。
  6. 记录来源 URL、抓取时间和程序版本,使结果可以追溯。

2. 正确理解 robots.txt

robots.txt 是 Robots Exclusion Protocol(REP)的约定文件,位于站点根路径。例如:

https://example.com/robots.txt

它以 User-agentAllowDisallow 等规则描述自动客户端应如何访问 URI。规则不是访问授权或安全控制;即使某个路径没有被禁止,也仍需遵守站点条款和适用法律。相反,出现在 Disallow 中的路径也不应被当成“隐藏地址”去访问。

RFC 9309 规定:可解析的规则应被遵守;robots.txt 因服务器或网络错误不可达时,爬虫应假定禁止访问。实践中可采用更保守的策略:无法确认规则时,暂停该站点的抓取并人工检查。

Python 标准库可做基本检查:

from urllib.robotparser import RobotFileParser

url = "https://example.com/articles/intro"
rp = RobotFileParser("https://example.com/robots.txt")
rp.read()

if rp.can_fetch("MyLearningBot", url):
    print("规则允许访问,仍需检查站点条款并控制频率")
else:
    print("不抓取该地址")

关于 Crawl-delay

Crawl-delay 并非 RFC 9309 的标准规则字段,但一些站点会提供它。urllib.robotparser 能读取该字段;若站点为你的 User-Agent 提供了有效值,应遵守。没有提供时,也应自行设置足够低的请求频率。

3. 请求礼仪:慢一点、明确一点、可停止一点

建议从单线程、间隔至少数秒的抓取开始。下面的例子每处理完一个 URL 才等待一次;它适合学习和小规模、明确授权的任务。

from time import sleep

urls = [
    "https://example.com/article-1",
    "https://example.com/article-2",
]

for url in urls:
    # fetch(url) 中应包含 timeout 和状态码检查
    print(f"准备请求:{url}")
    sleep(2)

不要把提高并发当作第一步。遇到 429 Too Many Requests403 Forbidden 或持续的 5xx 时,应停止任务,检查是否应降低频率、调整任务设计或取得站点许可;不要通过更换身份、代理池或绕过验证来继续访问。

4. 抓取前检查清单

  • 目标页面是公开可访问的,且用途符合站点条款。
  • 已检查 robots.txt;无法读取时按保守策略暂停。
  • 使用了真实、可识别的 User-Agent
  • 每个请求都设置了超时,且频率有限制。
  • 不抓取登录后内容、付费内容、个人敏感信息或访问控制后的数据。
  • 结果保存了来源和时间,便于复核与删除。

参考

评论