如何抓取数十亿页面? [关闭]

2024-06-18

是否可以在一台服务器上抓取数十亿个页面?


如果您希望数据是最新的,则不需要。

即使是搜索游戏中的小玩家也会爬行数十亿个页面。

" In 2006, Google has indexed over 25 billion web pages,[32] 400 million queries per day,[32] 1.3 billion images, and over one billion Usenet messages. " - Wikipedia

请记住,引文中提到的是 2006 年的数字。这是古老的历史。最先进的技术远不止于此。

内容新鲜度:

  1. 新内容不断以非常快的速度添加(现实)
  2. 现有页面经常发生变化 - 您需要重新爬网,原因有两个:a) 确定它是否已失效,b) 确定内容是否已更改。

爬虫的礼貌:

  1. 您无法压倒任何一个特定站点。如果您从同一 IP 重复访问任何主要站点,您可能会触发验证码提示,否则他们会阻止您的 IP 地址。站点将根据带宽、请求频率、“不良”页面请求数量以及各种其他因素来执行此操作。
  2. 网站向爬虫公开了一个 robots.txt 协议,请遵守它。
  3. 有一个网站向爬虫程序公开的站点地图标准,使用它来帮助您探索 - 您还可以(如果您选择)权衡网站上页面的相对重要性,并使用在缓存中的生存时间(如果网站中指出)地图。

减少您需要做的工作:

  1. 通常,网站会通过多个名称来暴露自己 - 您需要检测相同的页面 - 这可能发生在相同的 url 或不同的 url 上。考虑页面内容的哈希(减去带有不断变化的日期/时间的标题)。跟踪这些页面等效项并在下次跳过它们,或者确定给定站点之间是否存在众所周知的映射,以便您不必抓取它们。
  2. 垃圾邮件。很多人制作了大量的页面,这些页面只是传递给谷歌,但他们在网络上“播种”自己以让自己被抓取。

所以——你总是处于爬行的循环中。总是。您几乎肯定会在几台(很多很多)机器上。确保您能够遵守礼貌,但仍然对数据的新鲜度感到震惊。

如果您想按快进按钮并使用自己独特的算法处理页面...如果您需要快速,您可以使用预先构建的爬虫 - 想想“80 条腿”,如突出显示的。他们使用客户端计算能力来做到这一点。

80 条腿正在使用孩子们在网站上玩游戏的机器循环。想象一下网页上的后台进程,当您使用该页面/网站时,该进程确实会调用并工作,而您却不知道,因为它们正在使用 Plura 技术堆栈。

“Plura Processing has developed a new and innovative technology for distributed computing. Our patent-pending technology can be embedded in any webpage. Visitors to these webpages become nodes and perform very small computations for the application running on our distributed computing network.” - Plura Demo Page

因此,他们通过数千个 IP 的数千个节点发出“爬行”,并对站点保持礼貌,因此爬行速度很快。现在,我个人不知道我是否喜欢使用最终用户浏览器的方式,除非在所有使用他们的技术的网站上都非常明确地指出了这种方式 - 但如果没有其他的话,这是一种开箱即用的方法。

在社区驱动的项目中还编写了其他爬虫,您也可能会使用它们。

正如其他受访者所指出的那样——计算一下。您需要每秒抓取约 2300 个页面才能跟上每 5 天抓取 1B 页面的速度。如果你愿意等待更长的时间,这个数字就会下降。如果您认为要爬行超过 1B,则该数字会上升。简单的数学。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何抓取数十亿页面? [关闭] 的相关文章

随机推荐

  • 默认情况下,Spark sql 模式中的可为空性是建议性的。严格执行的最佳方法是什么?

    我正在开发一个简单的 ETL 项目 它读取 CSV 文件 执行 对每列进行一些修改 然后将结果以 JSON 格式写出 我想要读取我的结果的下游进程 确信我的输出符合 一个商定的模式 但我的问题是 即使我定义 我的输入模式的所有字段都为 nu
  • 在 Firefox 中访问全局事件对象

    目标 运行一些函数 ajaxStart 但仅限于由特定事件触发时 代码 loading indicator ajaxStart function if event null if event type hashchange event ty
  • AngularJS 仅在解析时返回两个 http get 请求

    我有一个 Angular 应用程序 在控制器中我需要调用一个发出两个 http get 请求的函数 并且我需要这个函数在解析这些值时返回这些值 我无法在 routeProvider 中解析它们 因为此函数需要在同一控制器中获取值 我展示了控
  • FileSystemWatcher 在队列中丢失文件

    我写了一个FileSystemWatcher为每个文件调用一次 pgm 但我的一些文件丢失了 我只用 10 11 个文件测试了代码 文件的删除会被正确记录 但创建不会被正确记录 某些文件未记录 我的 TASK 实施可能存在问题吗 或者有什么
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 如何禁用列表视图中的项目?

    我有一个列表视图 它是通过数据库中的记录填充的 现在我必须使一些记录可见但不可选择 我怎样才能做到这一点 这是我的代码 public class SomeClass extends ListActivity private static L
  • 如何获取原始触摸屏数据?

    我知道我可以在 iPhone 应用程序中获取触摸事件 但这些触摸事件都被我过滤掉了 如果我将设备按在脸上 它会过滤掉这些触摸事件 因为它可以检测到它不是手指 我如何获得原始触摸事件 而不以任何方式过滤 没有用于此目的的公共 API 您可以获
  • 根据属性中的值类型反序列化对象

    TL DR json net 中是否有一种简单的方法来检查属性的类型并基于该类型创建实例 我在 JSON 中有以下两个对象 它们是JSON API http jsonapi org data type Test id 1 and data
  • 如何开始在具有 zf-apigility-doctrine 的 Apigility 应用程序中使用 Doctrine 2?

    我想整合学说2 http www doctrine project org to an 敏捷性 https apigility org driven Zend 框架 2 http framework zend com 应用 所以我安装了zf
  • java.lang.NoSuchMethodError: org.mockito.Mockito.framework()Lorg/mockito/MockitoFramework

    我一直面临一个特殊的问题 基本上 当我正常运行 Mockito 测试 即 作为 Junit 测试运行 时 它会出现以下错误 有人可以帮我看看我的错误是什么吗 收到的错误 java lang NoSuchMethodError org moc
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • $(window).resize() 和打印预览模式

    我有一段非常简单的代码 可以在调整大小后刷新窗口 window resize function location reload 当我尝试在 Chrome 中打开打印预览模式 Ctrl P 时 它也会刷新它 有什么想法如何避免这种行为吗 要确
  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • 最小高度:自动在 Opera 中不起作用

    我注意到min height不在 Opera 中工作 我正在尝试这样的事情 div class content div div class content newstyle div 我的 CSS 代码是 content min height
  • 具有动态过滤标准的 JS Array.filter

    如何动态声明一组过滤条件而无需指定过滤器的数量 例如 如果我有一组数据 如下所示 var data item type wood size 10 item type wood size 8 item type metal size 8 我知
  • React.memo 与反应中的打字稿

    我在 tsx 文件 React typescript 中使用 React memo 现在我已经将 Props 的接口声明为 interface Props type string 我的组件看起来像 const Component React
  • Canvas drawImage 内联 svg 在 Firefox 上不起作用

    这是一个例子 它采用 svg 并将其转换为画布 http jsfiddle net Na6X5 944 http jsfiddle net Na6X5 944 var can document getElementById canvas1
  • 如何使用 jQuery 检查文件输入大小?

    我有一个具有文件上传功能的表单 如果用户尝试上传的文件太大 我希望能够有一些不错的客户端错误报告 是否有一种方法可以使用 jQuery 检查文件大小 或者纯粹是在客户端上或以某种方式将文件发送回服务器进行检查 您实际上无权访问文件系统 例如
  • 用于捕获审计跟踪的数据库设计的想法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何维护数据库中的数据日志 我必须维护对每一行所做的每次更改的日志 这意味着我不能允许DELETE and UPDATE待执行 我怎样才能保留这
  • 如何抓取数十亿页面? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在一台服务器上抓取数十亿个页面 如果您希望数据是最新的 则不需要 即使是搜索游戏中的小玩家也会爬行数十亿个页面 In 2006