为单个项目从多个来源收集数据的正确方法

Proper way of collecting data from multiple sources for a single item

这是我最近经常遇到的事情。我应该从单个项目的多个请求中抓取数据。

我一直在像这样使用请求元来累积请求之间的数据;

def parse_data(self, response):
    data = 'something'

    yield scrapy.Request(
        url='url for another page for scraping images',
        method='GET',
        meta={'data': data}    
    )

def parse_images(self, response):
    images = ['some images']
    data = response.meta['data']

    yield scrapy.Request(
        url='url for another page for scraping more data',
        method='GET',
        meta={'images': images, 'data': data}    
    )

def parse_more(self, response):
    more_data = 'more data'
    images = response.meta['images']
    data = response.meta['data']

    yield item

在最后一个解析方法中,我抓取了最终需要的数据并生成了项目。但是,这种方法对我来说看起来很尴尬。有没有更好的方法来抓取像这样的网页,或者我这样做是否正确?

记住 scrapy 是异步框架,这是一种非常常规和正确的方法。 如果你希望有更简单的代码结构,你可以使用 scrapy-inline-requests

但从我的角度来看,它比使用 meta 更麻烦。

这是在整个请求过程中跟踪您的项目的正确方法。我会做的不同的是,实际上只是像这样设置项目值:

item['foo'] = bar
item['bar'] = foo
yield scrapy.Request(url, callback=self.parse, meta={'item':item})

使用这种方法,您每次只需发送一件物品本身。在某些情况下,这是不可取的。