是否可以在单个服务器上抓取数十亿个页面?
如果您希望数据是最新的,则不是.
即使是搜索游戏中的小玩家也会对数十亿次抓取的网页进行编号.
"2006年,谷歌已经索引了超过250亿个网页,[32]每天4亿次查询,[32] 13亿张图片,以及超过10亿条Usenet消息." - 维基百科
请记住,引用提到了2006年的数字.这是古老的历史.最先进的技术远不止于此.
内容的新鲜度:
新内容不断以非常大的速度添加(现实)
现有页面经常更改 - 您需要重新抓取,原因有两个:a)确定它是否已死,b)确定内容是否已更改.
爬虫的礼貌:
你不能压倒任何一个给定的网站.如果您从同一IP重复访问任何主要站点,您可能会触发CAPTCHA提示或他们将阻止您的IP地址.站点将根据带宽,请求频率,"坏"页面请求数以及各种其他内容执行此操作.
有一个robots.txt协议,网站向抓取工具公开,遵守它.
有一个站点地图标准,网站向抓取工具公开,使用它来帮助您探索 - 您还可以(如果您选择)加权网站上页面的相对重要性,并使用在网站中指示的时间在您的缓存中生存地图.
减少您需要做的工作:
通常站点通过多个名称暴露自己 - 您将要检测相同的页面 - 这可能发生在相同的URL或单独的URL上.考虑页面内容的哈希值(减去日期/时间不断变化的标题).跟踪这些页面等效性并在下次跳过它们或确定给定站点之间是否存在众所周知的映射,以便您不必抓取它们.
垃圾邮件.很多人在那里制作大量的页面,只是通过谷歌,但他们在网络上"种子"自己爬行.
所以 - 你总是处于爬行的循环中.总是.你几乎肯定会在几台(很多很多)机器上.确保您能够遵守礼貌但仍然坚持数据的新鲜度.
如果您想按下快进按钮,只需使用您自己独特的算法处理页面....如果您需要快速使用,您可能会使用预先构建的爬虫 - 想想" 可编程网络 "中突出显示的"80条腿" .他们使用客户端计算能力来做到这一点.
80条腿正在使用孩子们在网站上玩游戏的机器周期.考虑一下网页上的后台进程,当您使用该页面/站点而不知道它时,它会调出并运行,因为他们使用的是Plura技术堆栈.
"Plura Processing为分布式计算开发了一种新的创新技术.我们正在申请专利的技术可嵌入任何网页.这些网页的访问者成为节点,并为在我们的分布式计算网络上运行的应用程序执行非常小的计算." - Plura演示页面
因此,他们通过成千上万个IP的数千个节点发出"爬行",并对网站表示礼貌并因此快速爬行.现在我个人不知道我关心使用最终用户浏览器的那种风格,除非在所有网站上使用他们的技术非常清楚地调出它 - 但是如果没有别的话,这是一种开箱即用的方法.
还有其他已编写的爬虫程序,这些爬虫程序位于社区驱动的项目中,您也可以使用它们.
正如其他受访者所指出的那样 - 做数学.您需要每秒抓取~2300页,以跟上每5天抓取1B页的速度.如果你愿意等待更长时间,那么这个数字会下降.如果你认为你的爬行次数超过了1B,那么这个数字会上升.简单的数学.
祝好运!
大规模的蜘蛛网(十亿页)是一个难题.以下是一些问题:
网络带宽.假设每页都是10Kb,那么你所说的总共需要10TB.
网络延迟/慢速服务器/拥塞意味着您无法实现网络连接的理论带宽.多线程您的爬虫只能帮助这么多.
我假设您需要存储从数十亿页中提取的信息.
您的HTML解析器需要处理以各种奇怪方式破坏的网页.
为了避免卡在循环中,您需要检测到您"已经完成此页面".
页面更改,因此您需要重新访问它们.
您需要处理'robots.txt'和其他约束(行为良好的)爬虫的行为.
Page和Brin(谷歌)1998年的原始论文描述了在10天内在4台机器上爬行2500万页.他们每台机器一次打开300个连接.我觉得这还不错.在我自己的运行Linux的现成机器的实验中,我可以可靠地打开100-200个同时连接.
爬行时需要做三件事:(1)选择接下来要抓取的内容,(2)获取这些页面,(3)存储这些页面.对于(1)您需要实现某种优先级队列(即,进行广度优先搜索或OPIC),您还需要跟踪您的位置.这可以使用Bloom过滤器完成.如果页面具有robot.txt文件并且排除了给定URL的前缀,则Bloom过滤器(在Wikipedia上查找)也可用于存储.
(2)获取页面是一个固定的成本,你不能做太多的事情; 但是,在一台机器上,你受限于开放连接的数量,如果你有电缆,你可能不会接近吃所有可用的带宽.您可能不得不担心带宽上限.
(3)存储页面通常在Web存档文件中完成,就像Internet Archive一样.通过压缩,您可以在7TB内存储10亿页,因此存储方面,拥有10亿页可以负担得起.作为对一台机器可以做什么的估计,假设你得到一台价格低廉的200美元机器,配备1Gb或RAM和160Gb硬盘.每页20KB(使用Range请求以避免吞噬整个大页面),1000万页需要200 GB,但压缩大约70 GB.
如果你保存一个你的搜索引擎运行的存档(你已经计算了说明页面排名和bm25),以及一个活动的爬网存档,那么你已经消耗了140 GB.这为您需要处理的其他随机内容留下了大约20 GB.如果你计算出内存,你需要尝试尽可能多地保留优先级队列和BloAM过滤器,你也正好处于可能的边缘.如果您每天抓取300,000页,则需要稍微超过一个月/ 1000万页抓取
问题提出5年后,我可以回答是.
我们的爬行机甚至不再昂贵,它可以被EBay购买约3000欧元,并包含24x1TB 2,5"磁盘(作为单磁盘运行)和两个6核Intel Xeon(使其成为12核/ 24线程)和在卢森堡数据中心使用10GBit线路(仅33%百分位数)的96GB RAM.
它使用100,000个并发HTTP连接,每秒爬行约30,000页.
是的,计算机今天非常快.顺便说一下,主要问题是URL处理和页面重复检测(可以通过各种方式访问相同的页面),但不是网络连接.