将网络爬虫数据存储在何处

本文关键字:存储 在何处 数据 爬虫 网络 | 更新日期: 2023-09-27 18:20:25

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

  1. 爬行似乎达到了瓶颈,无法更快地爬行,我在某个地方读到过对页面进行多线程http请求可以使爬行器爬行更快,但我不确定如何做到这一点。

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

我使用的是.Net框架、C#和MS SQL

将网络爬虫数据存储在何处

因此,首先,我不担心进入分布式爬网和存储,因为顾名思义:它需要相当数量的机器才能获得良好的结果。除非你有一个计算机农场,否则你将无法真正从中受益。你可以构建一个每秒300页的爬网程序,并在一台连接速度为150 Mbps的计算机上运行。

清单上的下一件事是确定你的瓶颈在哪里。

对您的系统进行基准测试

尝试消除MS SQL:

  • 加载一个列表,比如说,1000个你想要抓取的URL
  • 基准你爬行它们的速度

如果1000个URL不能给你足够大的爬行空间,那么就获得10000个URL或10万个URL(或者如果你觉得勇敢,那么获得Alexa前100万个)。在任何情况下,尽量建立一个排除尽可能多的变量的基线。

识别瓶颈

在你有了爬行速度的基线后,试着确定是什么导致了你的减速。此外,您将需要开始使用multitherading,因为您是i/o绑定的,在获取页面之间有很多空闲时间,可以用来提取链接和做其他事情,如使用数据库。

你现在每秒有多少页?你应该试着每秒读10页以上。

提高速度

显然,下一步是尽可能多地调整你的爬虫:

  • 试着加速你的爬虫,让它达到硬限制,比如你的带宽
  • 我建议使用异步套接字,因为它们比阻塞套接字、WebRequest/HttpWebRequest等快得多
  • 使用更快的HTML解析库:从HtmlAgilityPack开始,如果你觉得很勇敢,那么试试Majest12 HTML Parser
  • 使用嵌入式数据库,而不是SQL数据库,并利用密钥/值存储(散列密钥的URL,并将HTML和其他相关数据存储为值)

Go Pro

如果你已经掌握了以上所有内容,那么我建议你尝试成为职业选手!重要的是,你要有一个模仿PageRank的好的选择算法,以平衡新鲜度和覆盖率:OPIC在这方面几乎是最新和最棒的(又名自适应在线页面重要性计算)。如果你有上述工具,那么你应该能够实现OPIC并运行一个相当快的爬网程序。

如果你在编程语言上很灵活,不想偏离C#太远,那么你可以尝试基于Java的企业级爬虫,比如Nutch。Nutch集成了Hadoop和其他各种高度可扩展的解决方案。

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

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

如果你对Java基础设施不满意,你可能想看看微软的Azure表存储,了解类似的特性。不过,这是一个托管/云解决方案——你不能在自己的硬件上运行它。

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