请帮我解决以下情况:
想象一个典型的分类类别页面。包含项目列表的页面。当你点击你登陆内部页面的项目时。现在我的爬虫抓取了所有这些 URL,进一步抓取这些 URL 以获取项目的详细信息,检查初始种子 URL 是否为任何下一页。如果有,它将转到下一页并执行相同的操作。我将这些项目存储在 sql 数据库中。
假设 3 天后,种子 URL 中有新项目,我只想废弃新项目。可能的解决方案是:
在抓取每个项目时,我会检查数据库以查看该 URL 是否已被抓取。如果有,我只是让 Scrapy 停止进一步爬行。 问题:我不想每次都查询数据库。我的数据库会非常大,最终会使爬网变得非常慢。
我尝试存储上次抓取的 URL 并在开始时将其传递,一旦它找到这个 last_scraped_url,它就会停止抓取工具。 不可能,因为抓取 URL 的异步性质不会按照从种子 URL 接收到的顺序进行抓取。 (我尝试了所有方法使其井然有序 - 但那根本不可能)
有人可以提出任何其他想法吗?在过去的三天里,我一直在为此苦苦挣扎。
感谢您的回复。
请您参考如下方法:
在试图给你一个想法之前......
我必须说我会先尝试您的数据库选项。数据库就是为此而创建的,即使您的数据库变得非常大,也不应该使爬网速度显着变慢。 我吸取了一个教训:“首先进行愚蠢的实现。之后,你尝试优化。”大多数时候,当您先优化时,您只是优化了错误的部分。
但是,如果你真的想要另一个想法...... Scrapy默认是不会对同一个url进行两次爬取的。因此,在开始抓取之前,您可以将已经抓取的 url(3 天前)放入 Scrapy 用于了解哪些 url 已被访问的列表中。 (我不知道该怎么做。) 或者,更简单,在您的项目解析器中,您可以只检查 url 是否已经被抓取并返回 None 或相应地抓取新项目。
