【问题标题】: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】:

      理想情况下,任何可扩展且支持索引的存储都可用于此类用例。

      我知道用于此类目的的一些系统是 SolrElasticSearchRedis 或任何可以扩展的 SQL 数据库。

      我将 Redis 用于相同的目的,并且我已经存储了大约 200 万个 URL。我很确定,通过增加节点,我应该能够轻松扩展。

      【讨论】:

        【解决方案3】:

        你可以使用Apache Nutch进行爬取,这个库有能力在特定时期爬取url,并为此使用一些算法。
        例如:当特定url的页面在第二次抓取中没有改变时,增加下一次抓取的周期,如果有变化,减少这个周期。 您可以创建自己的 nutch 插件来解析 nutch 抓取的数据或使用预定义的 nutch 插件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-09
          • 1970-01-01
          • 2021-09-11
          • 2021-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多