前言
本文主要分享在爬站点图片过程中的一些踩坑总结
工具使用的是nodejs,外部依赖只使用了request、redis
分布式爬虫结构(类actor)
生产者爬取所有列表->产出pageUrl->生成任务给任务中心。
消费者注册->中心分配任务给消费者->消费者解析pageUrl成图片->下载到本地->回调中心
生产坑
1、任务过多,导致队列太大,内存溢出
解决方法:
1)使用redis均衡负载(靠谱
2)设置任务数量上限(成本低
解析坑
1、偶尔由于站点问题解析失败
图片站点服务未必稳定,有可能出现渲染失败的情况。这时候重试机制应该放在解析服务中,而不是由下载服务发起重试。
消费坑
1、远古资源下载速度极慢
原因1)
站点本身资源提供不稳定,某些资源永远请求都无响应。
解决方法:
设置超时重试,到一定次数则放弃该资源下载即可
原因2)
远古资源没有做CDN缓存,回源时间较长
解决方法:
1)坐等CDN回源
2)提前发起请求,然后消费者重新提交该任务,等下次消费到的时候就能下载CDN缓存的内容了
2、标题导致存储本地失败
原因&解决:
3、有部分重复广告图、脏数据
原因:
站点某些列表中的图片未必是我们需要的图片,有可能是站点下架后,摆上来的广告图。
解决方法:
1)存储几个文件MD5在本地,下载文件之前校验MD5是否match上广告图MD5,然后制定策略(更快)
2)下载后做离线处理,把一些几K的文件、脏数据清理掉(更稳)
4、失败case无法重跑
现象:
消费者拿完任务去下载,遇到异常失败的时候,没由正确收集失败case的方法。
解决方法:
1)在任务中心发任务和收任务、回调任务时做对比。保存失败的任务(优)
2)消费者自己记录失败case(已废弃)












网友评论