凌晨两点,我被手机告警吵醒了,别提多闹心了。屏幕上就一行字:“爬虫任务失败率超过30%”。我揉着眼睛打开电脑,登录服务器,翻出一堆日志文件,瞬间头大——这排查过程,简直是场噩梦。日志东一个西一个,散在好几个服务器上,时间格式更是乱得离谱,有的写`2024-03-15 02:13:45`,有的写`15/Mar/2024:02:13:45`,还有的直接甩个时间戳,我连哪个先哪个后都得反应半天。
我要找某个请求到底哪个时间点出的错,得在五六个文件之间来回切换、复制粘贴,眼睛都快看瞎了,折腾了一个多小时,最后发现问题简单得可笑:目标网站改版了,某个字段的XPath路径变了,爬虫拿不到数据,就一个劲报错。
说真的,如果一开始日志系统就搭好,我十分钟就能定位到问题,也不至于大半夜遭这份罪。那次之后,我痛定思痛,把爬虫的日志系统彻底重写了一遍。今天就把我踩过的坑、总结的核心思路分享给大家,新手朋友看完,再也不用为日志头疼。

一、别再瞎print了,纯属白费功夫
很多刚学写爬虫的同学,都爱犯一个错:在代码里瞎写print,比如`print(“开始爬取第” + str(page) + “页”)`。开发的时候看着还行,能知道程序跑没跑起来,但一旦部署到线上,这些print输出就跟往大海里扔纸条一样——根本没法检索,想找个报错信息,比登天还难。
我的做法很简单:统一用Python的logging模块,而且每条日志都必须打上三个标签——爬虫名称、任务ID、统一格式的时间戳。这样一来,后续想查问题,只需要用`grep “任务ID”`,就能把整个请求的来龙去脉串起来,不用再在一堆乱七八糟的输出里大海捞针,效率直接翻倍。
二、日志别啥都记,分级才是王道
很多人觉得,日志记越多越好,其实大错特错。日志太多,反而会淹没关键信息,查问题更费劲。正确的做法是分级记录,该记的记,不该记的坚决不记。
简单说,就分四级:
INFO:记正常流程,比如“成功抓取商品A,价格99元”,知道程序在正常跑就行;
WARNING:记那些不用管、能容忍的小问题,比如“第3页返回404,跳过不影响整体任务”;
ERROR:记必须人工介入的故障,比如“连续5次请求失败,任务中止”,这种才是需要我们重点关注的;
DEBUG:只在调试的时候打开!我见过有人线上也开着DEBUG,每小时写好几个G的日志文件,最后磁盘直接撑爆,还不知道问题出在哪,纯属给自己找罪受。
三、别写字符串日志了,结构化才是出路
如果你现在还在写`f“抓取{sitename}第{pagenum}页,状态码{status}”`这种字符串日志,听我的,立刻停掉!这种日志看起来直观,但后续想检索、分析,简直是灾难。
正确的做法是,用JSON格式输出日志,让日志变成可解析、可筛选的数据。比如写成:`{“event”:”fetch_page”, “site”:”example.com”, “page”:2, “status”:200, “duration_ms”:350}`。
这样一来,不管你是用grep筛选,用jq处理,还是把日志灌到Elasticsearch里做可视化看板,都特别方便,不用再手动截取字符串,省太多事。
四、监控不用贪多,三个核心指标就够了
很多人搭完日志系统,就把日志存那不管了,纯属浪费。搭建日志系统,核心不是“存”,而是“看”——通过日志,快速发现问题、定位问题。我每天就盯着三个数字看,简单又高效:
1. 抓取成功率:低于95%就要警惕了。如果突然下降,大概率是目标网站改版了,或者加了反爬措施;
2. 平均响应时间:如果突然变慢,要么是IP被网站限速了,要么是网络不稳定、抖动;
3. 错误分布:不同错误对应不同问题——404说明页面没了,503说明被反爬了,超时说明网络不通,针对性处理就行,不用瞎排查。
五、快速排查三板斧,省出半天时间
当爬虫出问题时,别慌,按这三步走,保证能省下大量时间,快速定位问题:
第一,先查最近一小时的错误日志分布。看看是只有某个爬虫报错,还是所有爬虫都报错?如果只是单个爬虫,说明是这个站点的问题;如果所有都报错,大概率是代码更新出问题,或者代理挂了。
第二,找最近一次成功的日志,和第一次失败的日志,放在一起对比。看看请求URL、请求头、响应内容有啥不一样,很多时候问题一眼就能看出来——比如某个字段,从`price`改成了`current_price`,爬虫自然拿不到数据。
第三,一定要设置关键告警。三种情况必须立刻通知:成功率突然下降、错误数暴增、长时间没有日志输出(说明爬虫可能已经挂了),别等问题扩大才发现。
总结
日志系统这件事,最忌讳的就是“等出了问题再搞”。平时花半天时间,把基础框架搭好,后续每次加新爬虫,只需要复制一下配置,花几分钟就能搞定。
一旦出事,定位问题的时间,能从几小时缩短到几分钟,多出来的时间,拿来睡觉、摸鱼,不香吗?
现在我的爬虫日志,都汇总到同一个地方,凌晨再收到告警,打开看板点两下,就知道问题出在哪。之前那个XPath路径变更的问题,如果放在今天,日志里会直接显示`“字段price未找到”`,再对比一下失败前后的响应内容,五分钟就能定位、修复,根本不用大半夜折腾。
所以别犹豫了,从你下一个爬虫开始,把日志系统认真搭起来,后续能少走很多弯路。
