我有一个简单的网络抓取工具,从root(给定网址)开始下载根网页的html然后扫描超链接并抓取它们。我目前将html页面存储在SQL数据库中。我目前面临两个问题:
看起来爬行已达到瓶颈并且无法更快地进行爬虫,我已经读过某个地方,对页面进行多线程http请求可以使爬虫爬得更快,但我不确定怎么做。
第二个问题,我需要一个高效的数据结构来存储html页面并能够对它们运行数据挖掘操作(目前使用SQL数据库希望听到其他建议)
我正在使用.Net框架,C#和MS SQL
答案 0 :(得分:11)
首先,我不担心进入分布式抓取和存储,因为顾名思义:它需要相当数量的机器才能获得良好的结果。除非你有一个电脑农场,否则你将无法从中受益。您可以构建gets 300 pages per second and run it on a single computer with 150 Mbps connection。
的抓取工具列表中的下一件事是确定你的瓶颈在哪里。
尝试消除MS SQL:
如果1000个网址没有为您提供足够大的抓取次数,那么请获取10000个网址或100k网址(如果您感觉很勇敢,请获取Alexa top 1 million)。在任何情况下,尝试建立一个基线,尽可能多地排除变量。
获得爬网速度的基线后,请尝试确定导致速度下降的原因。此外,您将需要开始使用多项合并,因为您已经受到i / o约束,并且您在获取页面之间有很多空闲时间,您可以花费在提取链接和执行其他操作(如工作)与数据库。
你现在每秒有多少页?你应该尝试每秒超过10页。
显然,下一步是尽可能地调整您的抓取工具:
如果你已经掌握了以上所有内容,那么我建议你试着去亲!重要的是你有一个很好的选择算法来模仿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不是在一个地方运行您的算法并通过它传输所有数据,而是将程序发送到存储数据的机器上运行。它允许您在基本上无限量的数据上运行算法,假设您有硬件。