gpt4 book ai didi

java - 检查网页是否已经下载

转载 作者:行者123 更新时间:2023-11-30 03:34:22 26 4
gpt4 key购买 nike

上下文

我编写了一个 Java 爬虫,它定期下载 Google 上列出的包含一组关键字的页面。这些页面要么是静态的(即,其内容不会改变),要么是动态的(即,其内容会发生变化,因为它是用户生成的或意味着每天更新/ecc...)。爬虫将每个页面存储在 MongoDB 数据库中,保存:

  • 标题
  • 网址
  • 内容(即整个页面的 HTML 内容)

问题

但是,页面可能会被多次下载,我的目标是了解某个页面是否已存在于我的数据库中并防止爬虫再次下载它。

我的解决方案

因此,我使用以下哈希函数对页面内容进行哈希处理:

private long hashFunction(String text) {
long h = 1125899906842597L;
int len = text.length();

for (int i = 0; i < len; i++)
h = 31*h + text.charAt(i);

return h;
}

并将哈希值与前面列出的字段一起存储在数据库中。因此,每次下载页面时,我都会对其内容进行哈希处理,如果哈希值已包含在数据库中,我就会丢弃该页面。

为什么我的解决方案不起作用

不幸的是,页面可能会发生一些变化,但仍然建议相同的内容。举个例子:

  • 从 Twitter 下载的页面会在每次请求时更改“身份验证 token ”

因此,我的数据库中有很多重复项,它们报告相同的内容,仅在某些字符上有所不同。

问题

是否有更智能的方法来跟踪页面之间的差异,以便在更改很小的情况下,我可以识别出该页面已经在数据库中?显然,该解决方案应该具有高性能,因为数据库可能会变得非常大,并且对大型文档执行精确匹配的成本可能会很高。

[编辑]一个暂定的解决方案(可能有意义......)

我想到了:

  • 仅从页面中提取正文
  • 删除标签(即 <...> 形式的所有内容)
  • 计算在此操作中幸存的文本部分的哈希值

这有道理吗?

最佳答案

如果您的问题是检查数据库中是否已存在页面的特定版本以防止爬网程序下载它,那么散列不是可行的方法,因为无论如何您都必须下载该页面才能生成散列.

如果您存储 Last-Modified http header值,您可以在所有后续请求中使用 If-Modified-Since http header 。如果你按照这种方式,你将不得不存储

  • 网址
  • 内容
  • 修改日期

存储内容对于进一步处理来说是很好的,但是我建议使用 html 抓取库来为你做这件事。看这个问题options-for-html-scraping

此外,我相信最好不要太频繁地下载数据(这可能取决于您的问题域),但您可以简单地假设该页面在过去 20 分钟左右没有发生变化。如果页面更改非常频繁,您无论如何都会落后于最新版本。

关于java - 检查网页是否已经下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28324157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com