在哪里存储网络抓取工具数据?

时间:2012-01-17 01:00:13

标签: c# algorithm web-crawler

我有一个简单的网络抓取工具,从root(给定网址)开始下载根网页的html然后扫描超链接并抓取它们。我目前将html页面存储在SQL数据库中。我目前面临两个问题:

  1. 看起来爬行已达到瓶颈并且无法更快地进行爬虫,我已经读过某个地方,对页面进行多线程http请求可以使爬虫爬得更快,但我不确定怎么做。

  2. 第二个问题,我需要一个高效的数据结构来存储html页面并能够对它们运行数据挖掘操​​作(目前使用SQL数据库希望听到其他建议)

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

2 个答案:

答案 0 :(得分:11)

首先,我不担心进入分布式抓取和存储,因为顾名思义:它需要相当数量的机器才能获得良好的结果。除非你有一个电脑农场,否则你将无法从中受益。您可以构建gets 300 pages per second and run it on a single computer with 150 Mbps connection

的抓取工具

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

对您的系统进行基准测试

尝试消除MS SQL:

  • 加载一个列表,例如,您要抓取的1000个网址。
  • 基准测试你抓取它们的速度有多快。

如果1000个网址没有为您提供足够大的抓取次数,那么请获取10000个网址或100k网址(如果您感觉很勇敢,请获取Alexa top 1 million)。在任何情况下,尝试建立一个基线,尽可能多地排除变量。

识别瓶颈

获得爬网速度的基线后,请尝试确定导致速度下降的原因。此外,您将需要开始使用多项合并,因为您已经受到i / o约束,并且您在获取页面之间有很多空闲时间,您可以花费在提取链接和执行其他操作(如工作)与数据库。

你现在每秒有多少页?你应该尝试每秒超过10页。

提高速度

显然,下一步是尽可能地调整您的抓取工具:

  • 尝试加速您的抓取工具,使其达到硬限制,例如您的带宽。
  • 我建议使用异步套接字,因为它们比阻塞套接字,WebRequest / HttpWebRequest等快得多。
  • 使用速度更快的HTML解析库:从HtmlAgilityPack开始,如果您感到勇敢,请尝试Majestic12 HTML Parser
  • 使用embedded database而不是SQL数据库,并利用密钥/值存储(哈希密钥的URL并将HTML和其他相关数据存储为值)。

Go Pro!

如果你已经掌握了以上所有内容,那么我建议你试着去亲!重要的是你有一个很好的选择算法来模仿PageRank以平衡新鲜度和覆盖率:OPIC is pretty much the latest and greatest in that respect (AKA Adaptive Online Page Importance Computation)。如果你有上述工具,那么你应该能够实现OPIC并运行一个相当快的爬虫。

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

答案 1 :(得分:2)

这就是Google的BigTable的设计目标。 HBase是一个流行的开源克隆,但你需要处理Java和(可能)Linux。 Cassandra也是用Java编写的,但是在Windows上运行。两者都允许.NET客户端。

因为它们被设计为分布在许多机器上(存在数千个节点中的实现),它们可以承受极其繁重的读/写负载,远远超过最快的SQL Server或Oracle硬件。

如果您对Java基础结构不满意,可能需要查看Microsoft的Azure Table Storage,以了解类似的特性。这是一个托管/云解决方案 - 你无法在自己的硬件上运行它。

至于处理数据,如果你选择HBase或Cassandra,你可以使用Hadoop MapReduce。 MR正在推广,因为您正在描述的任务 - 处理大量的网络数据。简而言之,我们的想法是,MapReduce不是在一个地方运行您的算法并通过它传输所有数据,而是将程序发送到存储数据的机器上运行。它允许您在基本上无限量的数据上运行算法,假设您有硬件。