我有一个简单的Web爬网程序,它从根(给定的url)开始下载根页面的html,然后扫描超链接并对其进行爬网。我目前将html页存储在SQL数据库中。我目前面临两个问题:

  • 似乎爬网达到了瓶颈,无法更快地进行爬网,我在某处读到,对页面进行多线程http请求可以使爬网器更快地爬网,但是我不确定如何执行此操作。
  • 第二个问题,我需要一个有效的数据结构来存储html页面并能够在其上运行数据挖掘操​​作(当前使用SQL数据库是想听听其他建议)

  • 我正在使用.Net框架,C#和MS SQL

    最佳答案

    因此,最重要的是,我不必担心要进行分布式爬网和存储,因为顾名思义,它需要相当数量的计算机才能使您获得良好的结果。除非您拥有计算机场,否则您将无法真正从中受益。您可以构建一个名为gets 300 pages per second and run it on a single computer with 150 Mbps connection的搜寻器。

    列表上的下一件事是确定瓶颈在哪里。

    对您的系统进行基准测试

    尝试消除MS SQL:

  • 加载例如要爬网的1000个URL的列表。
  • 基准化您可以多快地抓取它们。

  • 如果1000个URL不能为您提供足够大的爬网,请获取10000个URL或100k个URL(或者,如果您觉得自己很勇敢,请获取Alexa top 1 million)。无论如何,请尝试建立一个排除了尽可能多的变量的基准。

    识别瓶颈

    在掌握了爬网速度的基线之后,然后尝试确定是什么原因导致了速度下降。此外,对于,您将需要开始使用多交易的,因为您受I/O约束,并且在获取页面之间有大量的空闲时间,您可以将这些页面用于提取链接和执行其他操作(例如使用数据库)。

    您现在每秒获得几页?您应该尝试使每秒超过10页。

    提高速度

    显然,下一步是尽可能地调整您的搜寻器:
  • 尝试加快您的搜寻器的速度,使其达到诸如带宽之类的严格限制。
  • 我建议使用异步套接字,因为它们比阻止套接字,WebRequest/HttpWebRequest等要快得多。
  • 使用更快的HTML解析库:从HtmlAgilityPack开始,如果您感觉很勇敢,请尝试Majestic12 HTML Parser
  • 使用embedded database而不是SQL数据库,并利用键/值存储(散列键的URL,并将HTML和其他相关数据存储为值)。

  • 亲!

    如果您已经掌握了以上所有内容,那么我建议您尝试成为专业人士!重要的是,您必须有一个模仿PageRank的良好选择算法,以便平衡新鲜度和覆盖范围:OPIC is pretty much the latest and greatest in that respect (AKA Adaptive Online Page Importance Computation)。如果您具有上述工具,那么您应该能够实现OPIC并运行一个相当快的爬网程序。

    如果您对编程语言很灵活,并且不想与C#相距太远,则可以尝试使用基于Java的企业级爬网程序,例如Nutch。 Nutch与Hadoop和其他各种高度可扩展的解决方案集成。

    10-07 12:07
    查看更多