3

请帮我解决以下情况:

想象一个典型的分类类别页面。包含项目列表的页面。当您点击您登陆内部页面的项目时。现在我的爬虫抓取所有这些 URL,进一步抓取这些 url 以获取项目的详细信息,检查初始种子 URL 是否为任何下一页。如果有,它会转到下一页并执行相同的操作。我将这些项目存储在 sql 数据库中。

假设 3 天后,种子 URL 中有新项目,我只想废弃新项目。可能的解决方案是:

  1. 在抓取每个项目时,我会检查数据库以查看 URL 是否已被抓取。如果有,我只是要求 Scrapy 停止进一步爬行。问题:我不想每次都查询数据库。我的数据库将非常大,最终会使爬网变得超级慢。

  2. 我尝试存储最后抓取的 URL 并在开始时将其传递,当它找到这个 last_scraped_url 时,它只会停止爬虫。不可能,因为抓取 URL 的异步特性不会按照从种子 URL 接收到的顺序进行抓取。(我尝试了所有方法让它有条不紊地进行——但这根本不可能)

任何人都可以提出任何其他想法吗?在过去的三天里,我一直在为此苦苦挣扎。

感谢您的回复。

4

1 回答 1

2

在尝试给你一个想法之前......

我必须说我会先尝试您的数据库选项。数据库就是为此而建立的,即使您的数据库变得非常大,这也不应该使爬行速度显着变慢。我学到的一个教训是:“首先做愚蠢的实现。然后,你尝试优化。” 大多数情况下,当您首先优化时,您只是优化了错误的部分。

但是,如果你真的想要另一个想法...... Scrapy 的默认设置是不会对同一个 url 进行两次抓取。因此,在开始抓取之前,您可以将已经抓取的 url(3 天前)放入 Scrapy 用来知道哪些 url 已经被访问过的列表中。(我不知道该怎么做。)或者,更简单的是,在您的项目解析器中,您只需检查 url 是否已被抓取并返回 None 或相应地抓取新项目。

于 2014-08-14T13:05:25.770 回答