>看起来爬网到达瓶颈,并且无法更快地爬行,我已经阅读了一些地方,为网页制作多线程http请求可以使爬网程序更快地爬行,但我不知道如何做到这一点.
>第二个问题,我需要一个高效的数据结构来存储html页面,并能够对它们运行数据挖掘操作(目前使用sql数据库想听听其他建议)
我正在使用.Net框架,C#和MS sql
解决方法
列表中的下一件事是确定你的瓶颈在哪里.
对您的系统进行基准测试
尝试消除MS sql:
>加载您要爬网的1000个URL的列表.
测试您可以抓住它们的速度.
如果1000个网址没有给你足够大的抓取,那么可以获得10000个URL或100k的URL(或者如果你觉得勇敢,那么可以获得Alexa top 1 million).无论如何,尝试建立一个尽可能多的变量被排除的基线.
识别瓶颈
在抓取抓取速度的基线之后,尝试确定导致您的减速的原因.此外,您将需要开始使用多任务,因为您已经被绑定,并且您在获取可以用于提取链接并执行其他操作数据的其他操作的页面之间有很多空余时间.
你现在每秒要多少页?你应该尝试每秒获得超过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和各种其他高度可扩展的解决方案相集成.