我有一个简单的web爬虫,从根开始(给定url),下载根页面的html,然后扫描超链接并抓取它们。我目前将html页面存储在SQL数据库中。我目前面临两个问题:
我使用的是.Net框架、C#和MS。
发布于 2012-01-17 01:30:50
所以首先也是最重要的一点,我不担心进入分布式爬行和存储,因为顾名思义:它需要大量的机器才能获得好的结果。除非你有一个电脑农场,否则你就无法真正从它中获益。你可以建立一个爬虫的获取每秒300页,并在连接150 Mbps的单台计算机上运行。。
清单上的下一件事是确定瓶颈在哪里。
测试您的系统
尝试消除MS:
如果1000个URL没有给您足够大的爬行,那么获得10000或100 k URL(或者如果您感觉勇敢,那么就得到阿列克莎)。在任何情况下,尝试建立一个基线,尽可能多的变量排除在外。
识别瓶颈
在你有了爬行速度的基线之后,试着确定是什么导致了你的减速。此外,还需要开始使用多线程,因为i/o是绑定的,在获取页面之间有大量的空闲时间,您可以将这些空闲时间用于提取链接和处理数据库等其他事情。
你现在每秒有多少页?你应该试着每秒得到超过10页的信息。
提高速度
显然,下一步是尽可能地调整爬行器:
加油,亲!
如果你已经掌握了以上所有内容,那么我建议你试着去做职业选手!重要的是,为了平衡新鲜度和覆盖率,您必须有一个模仿PageRank的良好选择算法:OPIC在这方面几乎是最新和最伟大的(AKA自适应在线页面重要性计算)。如果您有上述工具,那么您应该能够实现OPIC和运行一个相当快的爬虫。
如果您在编程语言上很灵活,并且不想偏离C#太远,那么您可以尝试基于Java的企业级爬虫,比如纳奇。Nutch与Hadoop和其他各种高度可伸缩的解决方案集成在一起。
发布于 2012-01-17 01:03:24
这就是谷歌的BigTable设计的目的。HBase是一个流行的开源克隆,但是您需要处理的是Java和(可能) Linux。卡桑德拉也是用Java编写的,但运行在Windows上。两者都允许.NET客户端。
由于它们被设计成分布在许多机器上(存在数千个节点中的实现),它们可以承受极其沉重的读写负载,甚至比最快的SQL Server或Oracle硬件还多。
如果您对Java基础设施感到不舒服,您可能想看看微软的蓝表存储,看看类似的特性。不过,这是一个托管/云解决方案--您不能在自己的硬件上运行它。
至于处理数据,如果您选择HBase或Cassandra,您可以使用Hadoop MapReduce。MR被Google推广到了你所描述的任务中--处理大量的网络数据。简而言之,MapReduce的想法是,与其在一个地方运行您的算法,然后将所有的数据通过管道传输,不如将您的程序发送出去,在存储数据的机器上运行。它允许您在基本不受限制的数据上运行算法,前提是您拥有用于该数据的硬件。
https://stackoverflow.com/questions/8888454
复制相似问题