我能够保存我的抓取状态,并且Scrapy从截断状态继续成功。每次重新启动Spider时,我都会将start_urls保持恒定,即,每次重新启动Spider时,所输入的start_urls的顺序和列表都是恒定的。但是我需要对我的start_urls进行随机洗牌,因为我有来自不同域以及来自相同域的URL,但是按顺序排列,爬网延迟显着降低了我的爬网速度。我的名单是数以千万计的,我已经抓取了100万个URL。因此,我不想破坏任何东西或重新开始爬网。
我已经看到,requests.seen拥有看起来像已被访问的URL的哈希值。从Scrapy代码中,我可以确定它用于过滤重复项。但是我不确定spider.state或request.queue可以做什么来帮助保存状态或重新开始爬网。
答案 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文件即可。