Scrapy 案例:增量更新项目
请帮我解决以下问题:
想象一下一个典型的分类页面。这个页面上有一系列的商品列表。当你点击某个商品时,会跳转到该商品的详细页面。目前,我的爬虫会抓取所有这些网址,然后进一步抓取这些网址以获取商品的详细信息,还会检查最初的种子网址是否有下一页。如果有,它就会继续抓取下一页,重复这个过程。我把这些商品存储在一个SQL数据库里。
假设三天后,种子网址上出现了新商品,我只想抓取这些新商品。可能的解决方案有:
在抓取每个商品时,我会检查数据库,看看这个网址是否已经被抓取过。如果抓取过,我就让Scrapy停止继续抓取。 问题是:我不想每次都查询数据库。我的数据库会变得非常庞大,这样会导致抓取速度变得非常慢。
我尝试存储最后抓取的网址,并在开始时传递这个网址,一旦找到这个最后抓取的网址,就停止爬虫。 但这不可能,因为爬虫的异步特性导致网址并不是按照接收到的顺序被抓取的。 (我尝试了所有方法来让它有序进行,但这根本不可能。)
有没有人能给出其他的建议?我已经为这个问题苦恼了三天。
感谢大家的回复。
1 个回答
2
在给你一些建议之前,我想先说说我的看法……
我建议你先试试使用数据库。数据库就是为了存储数据而设计的,即使你的数据库变得很大,这也不会显著拖慢爬虫的速度。我学到的一条经验是:“先做一个简单的实现,然后再进行优化。”很多时候,如果你一开始就想着优化,结果可能会优化错地方。
不过,如果你真的想要其他的想法……
Scrapy的默认设置是不允许同一个网址被爬取两次。所以,在开始爬取之前,你可以把三天前已经爬取过的网址放到Scrapy用来记录已访问网址的列表里。(我不知道怎么做到这一点。)
或者,更简单的方法是在你的数据解析器中检查一下这个网址是否已经被爬取过,如果是,就返回None;如果不是,就按照正常流程爬取新的内容。