爬虫入门:边界、流程与请求礼仪
网页爬虫的基本工作是:请求公开资源 → 解析响应 → 提取所需字段 → 保存结果。技术上的“能拿到”不等于可以任意使用。开始写代码前,先确认目标站点的服务条款、数据使用规则,以及数据中是否包含个人信息或其他受保护内容。
1. 一次规范抓取的最小流程
- 明确数据用途、字段和来源,只抓取完成目标所需的数据。
- 查阅站点条款,并读取
https://目标域名/robots.txt。 - 为爬虫设置清晰的
User-Agent,不要伪装成浏览器或绕过访问控制。 - 使用低频、可控的请求;发生错误时停止或退避,而不是并发重试。
- 校验响应状态和内容类型,再解析与保存。
- 记录来源 URL、抓取时间和程序版本,使结果可以追溯。
2. 正确理解 robots.txt
robots.txt 是 Robots Exclusion Protocol(REP)的约定文件,位于站点根路径。例如:
它以 User-agent、Allow、Disallow 等规则描述自动客户端应如何访问 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 Requests、403 Forbidden 或持续的 5xx 时,应停止任务,检查是否应降低频率、调整任务设计或取得站点许可;不要通过更换身份、代理池或绕过验证来继续访问。
4. 抓取前检查清单
- 目标页面是公开可访问的,且用途符合站点条款。
- 已检查
robots.txt;无法读取时按保守策略暂停。 - 使用了真实、可识别的
User-Agent。 - 每个请求都设置了超时,且频率有限制。
- 不抓取登录后内容、付费内容、个人敏感信息或访问控制后的数据。
- 结果保存了来源和时间,便于复核与删除。