Web crawler 不对同一内容进行两次爬网
我正在构建一个小型应用程序,它将对内容不断增长的站点(如stackoverflow)进行爬网。不同的是,创建的内容很少被修改 现在,在第一步中,我将抓取站点中的所有页面 但接下来,该网站的页面内容——我不想重新抓取所有内容,只想抓取最新添加的内容 因此,如果站点有500个页面,在第二次访问中,如果站点有501个页面,那么我只会抓取第一和第二个页面。这是处理这种情况的好办法吗 最后,爬网的内容将在lucene中结束-创建一个自定义搜索引擎 因此,我希望避免对同一内容进行多次爬网。还有更好的主意吗 编辑: 假设该站点有一个页面:结果,可以这样访问: 结果?第1页,结果?第2页…等等Web crawler 不对同一内容进行两次爬网,web-crawler,Web Crawler,我正在构建一个小型应用程序,它将对内容不断增长的站点(如stackoverflow)进行爬网。不同的是,创建的内容很少被修改 现在,在第一步中,我将抓取站点中的所有页面 但接下来,该网站的页面内容——我不想重新抓取所有内容,只想抓取最新添加的内容 因此,如果站点有500个页面,在第二次访问中,如果站点有501个页面,那么我只会抓取第一和第二个页面。这是处理这种情况的好办法吗 最后,爬网的内容将在lucene中结束-创建一个自定义搜索引擎 因此,我希望避免对同一内容进行多次爬网。还有更好的主意吗
我想记录下上次爬网时有多少页,只要抓取差异就足够了。(可能使用页面上每个结果的散列-如果我开始遇到相同的散列-我应该停止)如果每个内容都位于一个唯一的位置,只需将这些位置(可能是URL)馈送到散列字段中,并在“爬行”内容之前检查它。无论如何,URL应该是您在Lucene中存储的数据的一部分,因此在添加到索引之前进行搜索应该很容易做到这一点。我的方法是存储所看到的每个页面内容的哈希/指纹。这样,当您重新蚀刻页面时,您将验证指纹,如果指纹匹配,则不会发生任何更改,也不需要解析,因为您已经处理了页面及其上的所有链接 站点是否为获取的每个资源发布有效的电子标签?如果是这样,您可以发布已知资源的条件GET,并且在服务器发送资源(即资源已更改)的情况下,您可以查找新链接以进行爬网、更新内容等 当然,只有当你的网站发布电子标签并响应有条件的get
查看“上次修改的”HTTP头。在C#中,从HttpWebResponse,如果它不等于DateTime。现在,内容已更改。因此,您可以使用本地内容(假设您正在存储它)为您的爬虫提供信息 因此,在爬网时,存储网页内容和“上次修改”标题 此外,您可以存储每个唯一的AbsoluteUri,直到AbsoluteUri的查找时间超过获取页面所需的时间为止,这样做效果很好,也可以使用Bloom筛选器:
除了弄清楚谷歌网站地图(或RSS提要)的位置外,你不知道新内容添加到了哪里。自动知道就像一个窃贼问你新买的东西在哪里,而不先问你。:) 我真的不知道问题是什么。如果你假设内容永远不会被修改,你希望新的可爬网链接如何出现?除了Thomas所说的,这种方法没有考虑到插入后内容可能会被更改。把它放在这里,想一想有很多答案的问题,其中澄清是对原始问题的修改……正如我在编辑中提到的,我的意思是,一旦添加了“结果”,它就不会改变。当我说pages时,我的意思更多的是分页一些结果。添加内容后,页面总数会发生变化,但一个结果的内容通常不会发生变化。该死,你是对的,我刚刚意识到页面上的每个结果都必须有一个唯一的url。谢谢:)但实际上获取页面可能比解析页面并将其添加到索引要慢。你需要把它取出来散列这就是冲突。。除非您获取它(或者直接询问服务器它是否更改),否则您不知道它是否更改。。OP如何知道页面计数已更改?了解页面名称与了解其内容不同。。至少我知道页面与之类似,页面确实会发生变化。