21

我正在尝试构建一个非常小的利基搜索引擎,使用 Nutch 来抓取特定网站。一些网站是新闻/博客网站。如果我抓取,比如说,techcrunch.com,并存储和索引他们的首页或他们的任何主页,那么在几个小时内我对该页面的索引就会过期。

像谷歌这样的大型搜索引擎是否有一种算法可以非常频繁地重新抓取频繁更新的页面,甚至每小时?或者它只是对频繁更新的页面评分很低,所以它们不会被退回?

如何在我自己的应用程序中处理这个问题?

4

4 回答 4

30

好问题。这实际上是WWW研究界的一个活跃话题。所涉及的技术称为重新抓取策略页面刷新策略

据我所知,文献中考虑了三个不同的因素:

  • 更改频率(网页内容的更新频率)
    • [1]:形式化了数据“新鲜度”的概念,并使用 apoisson process来模拟网页的变化。
    • [2]:频率估计器
    • [3]:更多调度策略
  • 相关性(更新的页面内容对搜索结果的影响程度)
    • [4]:最大限度地提高查询搜索引擎的用户体验质量
    • [5]:确定(接近)最佳爬行频率
  • 信息寿命(随着时间的推移从网页中出现和消失的内容片段的生命周期,与变化频率没有强相关性)
    • [6]:区分临时内容和持久内容

您可能想决定哪个因素对您的应用程序和用户更重要。然后,您可以查看以下参考以获取更多详细信息。


编辑:我简要讨论了 [2] 中提到的频率估计器,以帮助您入门。基于此,您应该能够找出其他论文中可能对您有用的内容。:)

请按照我在下面指出的顺序阅读本文。只要你知道一些概率和统计数据 101 应该不会太难理解(如果你只使用估计器公式可能会少得多):

步骤 1. 请转至6.4 节 - 应用到网络爬虫。在这里,Cho 列出了 3 种估计网页更改频率的方法。

  • 统一策略:爬虫以每周一次的频率重新访问所有页面。
  • 幼稚策略:在前 5 次访问中,爬虫以每周一次的频率访问每个页面。在 5 次访问之后,爬虫使用 naive estimator 估计页面的变化频率(第 4.1 节)
  • 我们的政策:爬虫使用建议的估计器(第 4.2 节)来估计更改频率。

步骤 2. 天真的政策。请转到第 4 部分。您将阅读:

直观地说,我们可以使用X/TX:检测到的变化的数量,T:监控周期)作为估计的变化频率。

子序列 4.1 节刚刚证明了这个估计是有偏差的7,不一致的8和低效的9

步骤 3. 改进的估计器。请转至第 4.2 节。新的估算器如下所示:在此处输入图像描述

其中\bar Xn - X(元素未更改的访问次数)并且n是访问次数。所以只要用这个公式来估计变化频率。您不需要理解小节其余部分中的证明。

第 4 步。第 4.3 节和第 5 节中讨论了一些技巧和有用的技术,它们可能对您有所帮助。第 4.3 节讨论了如何处理不规则间隔。第 5 节解决了这个问题:当元素的最后修改日期可用时,我们如何使用它来估计更改频率?使用最后修改日期的建议估算器如下所示:

在此处输入图像描述

论文中图10之后对上述算法的解释很清楚。

第 5 步。现在,如果您有兴趣,可以查看第 6 节中的实验设置和结果。

就是这样了。如果您现在感觉更有信心,请继续尝试 [1] 中的新鲜纸。


参考

[1] http://oak.cs.ucla.edu/~cho/papers/cho-tods03.pdf

[2] http://oak.cs.ucla.edu/~cho/papers/cho-freq.pdf

[3] http://hal.inria.fr/docs/00/07/33/72/PDF/RR-3317.pdf

[4] http://wwwconference.org/proceedings/www2005/docs/p401.pdf

[5] http://www.columbia.edu/~js1353/pubs/wolf-www02.pdf

[6] http://infolab.stanford.edu/~olston/publications/www08.pdf

于 2012-10-24T06:19:48.340 回答
6

谷歌的算法大多是封闭的,他们不会告诉他们是如何做到的。

我使用有向图的概念构建了一个爬虫,并将重新爬取率基于页面的度中心性。您可以将网站视为一个有向图,其中页面作为节点,超链接作为边。具有高中心性的节点可能是更新更频繁的页面。至少,这是假设。

这可以通过存储 URL 和它们之间的链接来实现。如果您抓取并且不丢弃任何链接,则每个站点的图表将会增长。为每个站点的每个节点计算(标准化的)进出度将让您衡量哪个页面最有兴趣更频繁地重新抓取。

于 2012-10-25T18:14:10.017 回答
3

尝试保留一些关于更新频率的首页统计信息。检测更新很容易,只需存储ETag/Last-Modified并在您的下一个请求中发送回If-None-Match/If-Updated-Since标头。保持运行平均更新频率(例如最近 24 次爬网)可以让您相当准确地确定首页的更新频率。

爬取首页后,您将确定下一次更新的预期时间,并在该时间左右将新的爬取作业放入存储桶中(一小时的存储桶通常是快速和礼貌之间的良好平衡)。每小时您只需获取相应的存储桶并将作业添加到您的作业队列中。像这样,您可以拥有任意数量的爬虫,并且仍然可以控制各个爬虫的调度。

于 2012-10-19T19:04:45.897 回答
2

无论如何,我都不是这个主题的专家,但站点地图是缓解这个问题的一种方法。

用最简单的术语来说,XML 站点地图(通常称为站点地图,带有大写字母 S)是您网站上的页面列表。创建和提交站点地图有助于确保 Google 了解您网站上的所有页面,包括可能无法通过 Google 的正常抓取过程发现的 URL。此外,您还可以使用站点地图向 Google 提供有关您网站上特定类型内容的元数据,包括视频、图片、移动设备和新闻。

谷歌专门使用它来帮助他们抓取新闻网站。您可以在此处找到有关站点地图的更多信息,并在此处找到有关 Google 新闻和站点地图的信息

通常,您可以在网站的 robots.txt 中找到 Sitemaps.xml。例如,TechCrunch 的 Sitemap 只是

http://techcrunch.com/sitemap.xml

这将这个问题变成了定期解析 xml。如果您在 robots.txt 中找不到它,您可以随时联系网站管理员,看看他们是否会提供给您。

更新 1 2012 年 10 月 24 日上午 10:45,

我与我的一位团队成员交谈,他给了我一些关于我们如何处理这个问题的额外见解。我真的想重申,这不是一个简单的问题,需要很多部分解决方案。

我们做的另一件事是监视几个“索引页面”以了解给定域的更改。以纽约时报为例。我们在以下位置为顶级域创建一个索引页面:

http://www.nytimes.com/

如果您查看该页面,您会注意到其他子区域,例如世界、美国、政治、商业等。我们为所有这些创建额外的索引页面。业务有额外的嵌套索引页面,如 Global、DealBook、Markets、Economy 等。一个 url 有 20 多个索引页面并不少见。如果我们注意到索引中添加了任何其他 url,我们会将它们添加到队列中以进行爬取。

显然,这非常令人沮丧,因为您可能必须为每个要抓取的网站手动执行此操作。您可能需要考虑为解决方案付费。我们使用SuprFeedr并且对它非常满意。

此外,许多网站仍然提供 RSS,这是一种有效的网页抓取方式。我仍然建议联系网站管理员,看看他们是否有任何简单的解决方案可以帮助您。

于 2012-10-24T06:29:14.417 回答