我有一只需要找到产品价格的蜘蛛。这些产品成批地分组在一起(来自数据库),并且具有批处理状态(RUNNING,DONE)以及start_time
和finished_time
属性会很好。 所以我有这样的:Scrapy:等待一些网址被解析,然后做点什么
class PriceSpider(scrapy.Spider):
name = 'prices'
def start_requests(self):
for batch in Batches.objects.all():
batch.started_on = datetime.now()
batch.status = 'RUNNING'
batch.save()
for prod in batch.get_products():
yield scrapy.Request(product.get_scrape_url(), meta={'prod': prod})
batch.status = 'DONE'
batch.finished_on = datetime.now()
batch.save() # <-- NOT COOL: This is goind to
# execute before the last product
# url is scraped, right?
def parse(self, response):
#...
这里的问题是由于scrapy的异步性质,批次对象的第二状态更新将会太快运行,对吧? 有没有办法将这些请求以某种方式组合在一起,并在最后一个被分析时更新批处理对象?
有趣的是,我看到这些信号可能是有用的。 在这种情况下,虽然可能“关闭”不是正确的(因为蜘蛛会处理多个批次,理想情况下我想知道每个批次的完成时间) –