【问题标题】:building a web crawler构建网络爬虫
【发布时间】:2013-09-27 11:23:57
【问题描述】:

我目前正在开发一个带有内置网络爬虫的自定义搜索引擎。出于某种原因,我不喜欢多线程,到目前为止,我的索引器是以单线程方式编码的。现在我对正在构建的爬虫有一个小困境。任何人都可以建议哪个更好,抓取 1 页然后对其进行索引,或者抓取 1000 多个页面并缓存,然后索引?

【问题讨论】:

  • 你的“小困境”究竟是什么?
  • 你为什么不进入线程?懒得弄清楚是一个蹩脚的借口,所以我希望不是这样。
  • 不是懒惰,我阅读了一篇关于从 sqlite 链接的线程缺点的文章,但是我已经给出了一个要点,所以我现在进入多线程,单线程索引器 + 多线程爬虫。感谢您的回复
  • 我自己正在考虑用 D 编写一个网络爬虫,所以我很想知道你的代码是否是开源的(因为我也可以帮助改进现有的,如果它适合的话我的需求)? :)

标签: c++ c search-engine


【解决方案1】:

网络很慢(相对于 CPU)。通过并行化爬虫,您将看到速度显着提高。否则,您的应用程序将花费大部分时间等待网络 IO 完成。您可以使用多线程和阻塞 IO,也可以使用单线程异步 IO。

此外,与一次索引一个文档相比,大多数索引算法在批量文档上的性能会更好。

【讨论】:

    【解决方案2】:

    更好?在什么方面?就速度而言,我无法预见明显的差异。就健壮性(从灾难性故障中恢复)而言,最好在抓取每个页面时对其进行索引。

    【讨论】:

      【解决方案3】:

      如果您对爬虫很认真,我强烈建议您“加入”多线程。基本上,您会希望始终运行至少一个索引器和至少一个爬虫(两者都可能有多个)。除其他外,这最大限度地减少了启动和关闭开销(例如初始化和释放数据结构)。

      【讨论】:

        【解决方案4】:

        不使用线程是可以的。 但是,如果您仍然想要性能,则需要处理异步 IO。 我建议查看 Boost.ASIO link text。使用异步 IO 将使您的困境“无关紧要”,因为这无关紧要。另外作为奖励,如果您将来决定使用线程,那么告诉 Boost.Asio 应用多个线程来解决问题是微不足道的。

        【讨论】:

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