4月6日夜里十点二十三分,星辰科技的抓取程序取得第一条联网数据。
拨号成功前,它已经忙音六次。楼上五金店老板每隔十分钟便踩一下地板,提醒马飞电话费正从押金里扣。半地下室的折叠床没地方展开,马飞只好坐在装手册的纸箱上,膝盖顶着桌沿。
页面来自一所高校的公开服务器,正文只有两百多字,介绍实验室研究方向。程序把标题、地址、更新时间和文本内容写入本地文件,耗时四十七秒。
马飞在日志第一行手写:
文档000001,来源公开,抓取成功。
接下来两个小时,程序又下载了六十三个页面。
第六十四个页面让它陷入循环。
站点日历给每一天生成一个新地址,程序不断沿“下一天”前进。即使页面内容几乎相同,地址也永远不会重复。电话计费表上的分钟数不停增加。
马飞发现时,已经浪费了二十七分钟。
他立刻断线。
电话清单上多出四元六角。那是他一天多的饭钱。楼上老板拿算盘算完,问日历上的字到底值不值这个价。
“不值。”马飞把钱从生活费信封里拿出来,“所以今晚不能再让它碰同一个坑。”
老板收了三元,剩下一元六角记在下个月库存维护里。他嘴上说不是赊账,只是怕马飞饿倒以后没人修程序。
未来成熟爬虫会有内容指纹、路径规则和站点级抓取预算。此刻,他只写了最基本的地址去重。知道缺什么不难,难的是在一台旧486上用尽可能少的内存补上。
他先为正文计算简短指纹,再规定每个站点单次最多抓取五十页。若连续五页的文本相似度过高,自动暂停该路径。所有暂停必须写入日志,下一次由人工判断是否恢复。
第二天,苏雨桐看完代码,指出另一个问题。
她来时带了两个食堂馒头,进门先摸水管,再看防水铁盒。确认备份没湿,她才把一个馒头放到马飞桌上。马飞正准备说昨天新增六十三页,她已经在日志里看见那二十七分钟循环。
“你只考虑自己会不会浪费电话费,没考虑对方服务器。”
“每次请求间隔十秒。”
“多个路径并行时不是十秒。对同一站点,你有三次请求只隔了两秒。”
早期网络带宽稀缺,一台不受控制的抓取程序足以让小型服务器明显变慢。规则尚未形成,不意味着伤害不会发生。
两人给程序加上站点级队列:同一服务器至少间隔二十秒,夜间访问也限制总量。请求标识中写明“XingchenCrawler/0.1”,附上联系邮箱和退出方式。
为验证限制真的生效,苏雨桐把三条不同路径同时放进队列,拿秒表守了二十分钟。程序有一次在第十九秒提前发出请求,她让马飞整段重写,不能靠多加一秒掩盖计时误差。凌晨十二点四十七分,连续三十次间隔都超过二十秒,她才在测试单上签字。
“有人会给一个爬虫写信?”马飞问。
“有人不想被抓时,总要找得到你。”
三天后,真的有人写来。
邮件来自某高校网络中心,只有一句话:
请停止访问 `/student/` 目录,其中含临时个人主页。
马飞立即把该路径加入禁止列表,删除已经取得的十一页内容,并回复说明处理结果。
第二封邮件在次日到达。
对方问:你们做的是什么?

