0

我已经实现了一个基本的爬虫,它从种子 URL 中检索数据并能够下载页面。此外,我可以将我的爬虫保留在同一个种子网站中,直到达到指定的深度。 我如何才能对我的爬虫施加更多限制,例如只有在通过预定义关键字的最小阈值时才下载页面? shouldvisit() 函数中有这样的方法吗?

4

1 回答 1

1

不幸的是,你有一个不可能的约束,这是爬虫的标准。您必须下载该页面以确定它是否包含您要查找的关键字。与大多数爬虫一样,crawler4j 只能对已下载的数据进行操作,对于尚未爬取但只知道其 URL 字符串的页面,该字符串可以但通常不包含某些关键字。这

    public boolean shouldVisit(WebURL url)

确实是唯一的官方位置(即,不修改原始库),您可以在其中做出决定,并且您必须以 URL 为基础。

但是,如果出于某种原因您必须在下载页面之前了解关键字,您可以考虑使用像 Bing 这样的第三方 Web 服务 API 来索引公共网页,并尝试查看他们对该页面的搜索结果是否包含您正在寻找的关键字 -但这仅适用于 Bing 等服务可以访问的公共站点。您还需要权衡查询 Bing 与仅自己下载页面的利弊,在大多数情况下,自己下载可能更有意义。

最后一个想法,以防我误读了你。如果您的意思是不再根据您刚刚下载的页面下载任何链接/页面(例如,不要访问页面 X 上的任何链接,因为页面 X 没有包含正确的关键字,因此该页面上的链接被认为是错误的)。如果是这种情况,您必须从某个中央数据存储(如数据库)访问父 URL,并检查您是否应该在以下位置访问它:

    public boolean shouldVisit(WebURL url)

前提是您将所述信息添加到中央数据存储中:

    public void visit(Page page)

方法。不管 shouldVisit 是确定爬虫是否应该去获取内容的最终方法。默认情况下,您只需要继续提供那里提供的 URL 信息,或者您尝试使用的任何其他内容,例如您自己的填充数据存储或 3rd 方 API。最后一个警告是,如果您确实使用集中式数据存储或 3rd 方 API,crawler4j 是多线程的,因此您在从 shouldVisit 方法访问任何内容时要考虑到这一点。

于 2014-11-07T18:50:54.580 回答