我正在构建一个小型应用程序来抓取内容增长的网站(比如在stackoverflow上),区别在于创建的内容很少被修改。
现在,在第一遍中,我抓取了网站中的所有网页。
但接下来,该网站的分页内容 - 我不想重新抓取所有内容,只是最新添加内容。
因此,如果该网站有500页,如果该网站有501页,则在第二次通过时,我只会抓取第一页和第二页。这是处理这种情况的好方法吗?
最后,抓取的内容最终会以lucene结尾 - 创建自定义搜索引擎。
所以,我想避免多次抓取相同的内容。有更好的想法吗?
编辑:
假设该网站有一个页面:将按如下方式访问的结果:
结果?page = 1,Results?page = 2 ... etc
我想跟踪上次抓取时有多少页面只是抓取差异就足够了。 (也许在页面上使用每个结果的哈希 - 如果我开始遇到相同的哈希 - 我应该停止)
答案 0 :(得分:5)
如果每个内容都位于一个唯一的位置,只需将这些位置(可能是URL)提供给哈希字段,然后在“抓取”内容之前检查它。无论如何,URL应该是Lucene中存储数据的一部分,因此在添加到索引之前通过搜索很容易实现。
答案 1 :(得分:2)
我的方法是存储每个页面内容的哈希/指纹。这样,当您重新获取页面时,您将验证指纹,如果它匹配,则没有任何更改,也不需要解析,因为您已经处理了页面及其上的所有链接。
答案 2 :(得分:1)
网站是否为每个被提取的资源发布有效的电子标签?如果是这样,您可以发出已知资源的条件GET,并且在服务器发送资源的情况下(即它已经更改),您可以查找要抓取的新链接,更新内容等。
当然,这仅适用于您的网站发布电子标签并响应条件获取...
答案 3 :(得分:1)
答案 4 :(得分:1)
查看“Last-Modified”HTTP标头。在C#中,来自HttpWebResponse,如果它不等于DateTime.Now,则内容已更改。因此,您可以使用本地内容(假设您正在存储它)来为您的抓取工具提供信息。
因此,当您进行爬网时,请存储WebPage内容和“Last-Modified”标题。
此外,您可以存储每个唯一的AbsoluteUri,它可以很好地运行,直到AbsoluteUri的查找时间超过了获取页面所需的时间,或者您可以使用Bloom过滤器:http://en.wikipedia.org/wiki/Bloom_filter。
除了确定Google站点地图的位置(或RSS源)之外,您将不知道新内容的添加位置。自动了解就像一个窃贼,询问你的新购买地点,而不是先问你。 :)