$ ls ~yifei/notes/

通用爬虫系统设计

Posted on:

Last modified:

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

  • 爬取整站思路:使用图遍历算法
  • 爬取更新思路:找列表页,不断刷新获得更新
    • hub 和 detail 两种页面不应该严格区分,而是作为每一个页面的两个属性
    • 一个页面内抓取的是列表还是单个数据。值的列表如何重组为对象的列表。

需要关注的指标

  • 网页的成功率(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]
  • 每个域名后面有多少 IP 都需要统计
  • 对于过大的网页要抛弃,抓网页大小设置成 2M 就可以了
  • 对站点抓取要控制频率,每个 domain 有一个访问频率统计
  • 每个抓取机器都有自己的 DNS 缓存
  • 要把文件汇聚成大文件存储,而不要每个网页都存储一个文件,减少磁盘寻道时间。也就是 GFS 呗。
  • 一定要启用 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/
  6. https://memorious.readthedocs.io/en/latest/buildingcrawler.html
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站