代码之家  ›  专栏  ›  技术社区  ›  sirrocco

不将同一内容爬行两次

  •  4
  • sirrocco  · 技术社区  · 15 年前

    我正在构建一个小应用程序,它将对内容正在增长的站点(如stackoverflow)进行爬网。不同之处在于,一旦创建的内容很少被修改。

    现在,在第一个步骤中,我对站点中的所有页面进行爬行。

    但是接下来,该站点的页面内容——我不想重新对所有内容进行爬行,只想对最新添加的内容进行爬行。

    所以如果站点有500页,第二遍如果站点有501页,那么我只会对第一页和第二页进行爬行。这是处理这种情况的好方法吗?

    最后,被爬网的内容将以Lucene结尾-创建一个自定义搜索引擎。

    所以,我希望避免对同一内容进行多次爬行。有更好的主意吗?

    编辑:

    假设该站点有一个页面:结果将按如下方式访问:

    结果?page=1,结果?页面=2等

    我想,跟踪上一次爬行时有多少页就够了,只要爬行一下就行了。(可能使用页面上每个结果的哈希-如果我开始遇到相同的哈希-我应该停止)

    5 回复  |  直到 15 年前
        1
  •  5
  •   dlamblin    15 年前

    如果每个内容都在一个唯一的位置,只需将这些位置(可能是URL)输入一个哈希字段,并在“爬行”内容之前检查它。无论如何,URL应该是Lucene中存储数据的一部分,因此在添加到索引之前,通过搜索很容易实现这一点。

        2
  •  2
  •   lexu    15 年前

    我的方法是存储所看到的每个页面内容的哈希/指纹。这样,当您重新蚀刻一个页面时,您将验证指纹,如果匹配,则不会发生任何更改,也不需要解析,因为您已经处理了页面及其所有链接。

        3
  •  1
  •   Jacob O'Reilly    15 年前

    站点是否为每个正在获取的资源发布有效的电子标签?如果是这样,您可以发出已知资源的条件获取,并且在服务器发送资源(即它已更改)的情况下,您可以寻找新的链接进行爬行、更新内容等。

    当然,只有当你的网站发布电子标签并响应条件获取时,这才有效。

        4
  •  1
  •   hoju    14 年前
    1. 对整个网站进行标准的爬行,以获取所有历史内容
    2. 跟踪他们的RSS源以查找新内容
    3. 定期重复网站范围的爬网以获取更新的内容
        5
  •  1
  •   arachnode.net    11 年前

    查看“上次修改”的HTTP头。在c中,如果httpwebResponse不等于datetime,则返回它。现在,内容已更改。因此,您可以使用本地内容(假设您正在存储它)来为爬行器提供数据。

    所以,当你爬行时,存储网页内容和“上次修改”的标题。

    此外,您也可以存储每个唯一的绝对URI,这在绝对URI的查找时间超过获取页面所需的时间之前工作良好,或者可以使用Bloom筛选器: http://en.wikipedia.org/wiki/Bloom_filter .

    除了弄清楚谷歌网站地图在哪里(或RSS提要),你不知道新内容在哪里添加。自动知道就像一个窃贼问你的新买的东西在哪里,而不是先问你。:)