通用爬虫系统设计

总的来说,爬虫可能需要处理两种任务,一种是日常的大规模爬取,可能需要对某些站点或者全网进行周期性爬取;另一种可能是临时对某个站点的某类网页提取一些数据,只需要爬取特定的一类网页。两者没有特别明晰的界限,而且后者也可以直接从第一种已经爬过的网页中提取数据就可以了。另外,对于后者来说,抓过的页面不需要再抓,而对于搜索引擎来说,还需要分辨出哪些连接需要反复抓。

竞品监控,对于竞争对手,监控对方的数据;对于潜在收购对象,监控对方数据是否真实。在这其中,数据的可视化非常重要。[4]

  • 爬取整站思路:使用图遍历算法
  • 爬取更新思路:找列表页,不断刷新获得更新

  • hub 和 detail 两种页面不应该严格区分,而是作为每一个页面的两个属性

  • 网页上的链接应该分两种类型:button 和 anchor。button 在同一个页面内,window 不会消失;anchor 会加载新的页面
  • 一个页面内抓取的是列表还是单个数据。值的列表如何重组为对象的列表。如果乳量不宜,对应就丢了,很棘手。
  • 如果用 url 做主键也有问题,url 可能是不更新的,而页面内容在更新

需要关注的指标

  • 网页的成功率(200 OK)
  • 网页的下载时长
  • 网页的大小
  • html 解析成功率
  • crawl rate,新链接的速率
  • 旧链接的比例

评估指标:覆盖度,时效性,死链率

提高抓取效率

  1. 使用自己的 dns 是一个提高速度的很好方法
  2. 使用 [bloom filter][1]
  3. 如果可能的话,可以使用 google、bing、baidu, archive.org
    1. 去发现站点的新连接
    2. 获取 meta 信息
    3. 直接抓取 google 的缓存
  4. auto-throttle algorithm
  5. 使用你的用户作为出口节点
  6. 抓取并使用所有有外网访问权限的 web 服务作为节点
  7. 反向生成 [站点模板][3]
  8. 每个域名后面有多少 IP 都需要统计
  9. 对于过大的网页要抛弃,抓网页大小设置成 2M 就可以了
  10. 对站点抓取要控制频率,每个 domain 有一个访问频率统计
  11. 每个抓取机器都有自己的 DNS 缓存
  12. 要把文件汇聚成大文件存储,而不要每个网页都存储一个文件,减少磁盘寻道时间。也就是 GFS 呗。
  13. 一定要启用 gzip,会大规模的减少数据的吞吐

重新访问策略

我们知道网页总是会更新的。在大规模的网络爬取中,一个很重要的问题是重抓策略,也就是在什么时候去重新访问同一个网页已获得更新。要获得这个问题的解,需要满足如下两个条件:

  1. 尽可能地少访问,以减少自身和对方站点的资源占用
  2. 尽可能快的更新,以便获得最新结果

这两个条件几乎是对立的,所以我们必须找到一种算法,并获得一个尽可能优的折衷。

可以使用泊松过程:https://stackoverflow.com/questions/10331738/strategy-for-how-to-crawl-index-frequently-updated-webpages

参考

 
1. http://www.cnblogs.com/coser/archive/2012/03/16/2402389.html
2. http://www.zhihu.com/question/24326030/answer/71813450
3. https://www.zhihu.com/question/27621722
4. https://en.wikipedia.org/wiki/Web_crawler
5. https://intoli.com/blog/aopic-algorithm/

及时获取更新,请关注公众号“爬虫技术学习”(spider-learn)

多年大厂求职&面试官经验,简历付费优化,¥ 500/次。

公众号“爬虫技术学习(spider-learn)”

About 逸飞

后端工程师

发表评论

邮箱地址不会被公开。 必填项已用*标注