Scrapy如何保存爬网状态?

时间:2019-07-03 21:52:14

标签: python scrapy

我能够保存我的抓取状态,并且Scrapy从截断状态继续成功。每次重新启动Spider时,我都会将start_urls保持恒定,即,每次重新启动Spider时,所输入的start_urls的顺序和列表都是恒定的。但是我需要对我的start_urls进行随机洗牌,因为我有来自不同域以及来自相同域的URL,但是按顺序排列,爬网延迟显着降低了我的爬网速度。我的名单是数以千万计的,我已经抓取了100万个URL。因此,我不想破坏任何东西或重新开始爬网。

我已经看到,requests.seen拥有看起来像已被访问的URL的哈希值。从Scrapy代码中,我可以确定它用于过滤重复项。但是我不确定spider.state或request.queue可以做什么来帮助保存状态或重新开始爬网。

1 个答案:

答案 0 :(得分:0)

通过回调 errback 调用请求时,您可以将这些请求写到txt文件中,同时将它们分开。

def start_requests(self):
    for u in self.start_urls:
        yield scrapy.Request(u, callback=self.parse,
                                    errback=self.err,
                                    dont_filter=True)

def parse(self, response):
    with open('successful_requests.txt', 'a') as out:
        out.write(response.url + '\n')

def err(self, failure):
    with open('failed_requests.txt', 'a') as out:
        out.write(response.url + ' ' + str(failure) + '\n')

要达到请求状态,只需阅读这些txt文件即可。