【问题标题】:Web crawler - how to build the visited url set?网络爬虫 - 如何构建访问的 url 集?
【发布时间】:2017-04-29 12:23:22
【问题描述】:
我在rabbitMQ上实现了一个分布式网络爬虫。除了访问的 url 集之外,一切都差不多完成了。我想在不同的爬虫之间有某种共享变量。
此外,正如我一直在阅读的那样,这个 url 集的大小会很大,应该存储在磁盘中。
在分布式环境中存储、访问和共享此访问 URL 列表的最佳方式是什么?
【问题讨论】:
标签:
python
rabbitmq
web-crawler
shared-memory
distributed-computing
【解决方案1】:
正如 majidkabir 所说,Nutch 是一个很好的解决方案……但这并不能回答问题,因为它是关于在构建 自己的 爬虫时如何跟踪状态。
我将提供我在 Node (https://www.npmjs.com/package/node-nutch) 中创建爬虫时采用的方法。从名称中可以看出,我所采用的方法反过来又以 Nutch 中采用的方法为蓝本。
我所做的只是使用 URL 作为键(在规范化之后),然后在 S3 中存储一个包含爬网状态的简单 JSON 文件。当需要运行下一次爬网时,我会快速浏览每个 JSON 文件,寻找要爬网的候选对象,然后在检索页面后,设置 JSON 以指示下一次爬网的时间。
我抓取的页面数量从来都不是很大,所以这很好,但如果它确实变得更大,我会将 JSON 放入 ElasticSearch 之类的东西中,然后根据日期字段搜索要抓取的 URL。
【解决方案2】:
理想情况下,任何可扩展且支持索引的存储都可用于此类用例。
我知道用于此类目的的一些系统是 Solr、ElasticSearch、Redis 或任何可以扩展的 SQL 数据库。
我将 Redis 用于相同的目的,并且我已经存储了大约 200 万个 URL。我很确定,通过增加节点,我应该能够轻松扩展。
【解决方案3】:
你可以使用Apache Nutch进行爬取,这个库有能力在特定时期爬取url,并为此使用一些算法。
例如:当特定url的页面在第二次抓取中没有改变时,增加下一次抓取的周期,如果有变化,减少这个周期。
您可以创建自己的 nutch 插件来解析 nutch 抓取的数据或使用预定义的 nutch 插件。