用 AI 写爬虫之前,先把目标限定为自己拥有或已获允许的网站。本教程只在本机虚构站点上测试:采集入口页和两篇商品介绍,检查是否遵守 robots.txt、是否避开外站链接,并把页面标题写到 CSV。没有访问任何公网网站。
先决定哪些页面可以采集
网页能打开,不代表可以任意批量抓取。开始前先确认站点所有者许可、服务条款和适用规则;不要登录后抓取、绕过验证码、提交表单或采集个人信息。个人信息保护法对个人信息处理有明确要求,本例因此不放真实客户资料。
robots.txt 可以告诉自动采集程序哪些路径不要访问,但不能当作授权。IETF RFC 9309 明确说明,Robots Exclusion Protocol 规则不是访问授权。即使 robots.txt 允许,也仍应先确认所有者允许和实际用途合规。若无法确认,先问站点所有者,或像本文一样只用本机模拟站点。
让模型先生成初稿,再审查限制条件
这次用本机 Ollama 的 Gemma4-12B 写 Python 标准库脚本。生成耗时 72.78 秒,模型加载 6.95 秒,输入 336 tokens、输出 1,381 tokens;本机已有模型,没有调用付费 API。初稿看似完整,但人工检查发现:只识别绝对链接,无法遍历常见的相对链接;响应是字节数据,却传给字符串正则;读取 robots.txt 没有独立超时;输出 CSV 会覆盖已有文件。
我保留了模型原始回复,修正后才在本机运行。最终脚本只发 GET 请求,设定清晰的 User-Agent、5 秒超时、至少 1 秒请求间隔、最多 10 页和每页 1 MiB 上限;只访问同源页面,并遵守 robots 规则。它采集 title、h1 和 meta description,不登录、不提交表单、不读取个人资料,也不会覆盖已有 CSV。模型生成的爬虫代码不能直接拿去抓真实站点。
在本机启动虚构网页
解压站点爬虫练习包。打开终端一,在练习包内进入 mock_site 文件夹并启动 Python 自带的静态服务:
cd mock_site
python3 -m http.server 8765 --bind 127.0.0.1
它只绑定本机回环地址。再打开终端二,进入练习包根目录,运行:
python3 authorized_crawler.py http://127.0.0.1:8765/index.html result.csv 10
看到采集结果后,在终端一按 Control-C 停止服务。输出 result.csv 必须是新文件名;已有同名文件时,程序会停止,避免覆盖。
脚本先读取同一站点的 /robots.txt,然后从入口页按链接逐层访问。只保留相同协议、主机和端口的页面;带查询参数的链接不继续采集;禁止路径直接跳过。页面超过 1 MiB、不是 HTML、请求失败时,不把内容当成成功结果。你可以对照 mock_site/robots.txt 和 CSV 看它实际抓了哪些页面。
本机实测结果
入口页链接到两篇商品介绍、一个被 robots.txt 禁止的客户路径和一个外站。结果 CSV 有 3 条记录:入口页、陶杯和手工皂;禁止路径和外站链接没有进入结果。标题、H1、描述与样例 HTML 一致,错误数为 0。再次使用同一个输出文件名会以退出码 2 停止。
Python 的 urllib.robotparser 提供 can_fetch() 等方法来读取 robots 规则,但它不能代替站点许可审查。个人信息、版权、服务条款、访问频率和系统负载都要结合目标网站及用途判断。本次只验证了本机静态 HTML;动态渲染、登录页面、真实站点策略和法律适用性均未实测。
练习包内容
下载站点爬虫练习包,其中有本机虚构网页、robots 文件、任务卡、模型原始输出、人工修正后的代码和测试记录。请先用本机样例熟悉流程,不要把示例 URL 换成陌生网站直接批量采集。