为单个项目从多个来源收集数据的正确方法
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})
使用这种方法,您每次只需发送一件物品本身。在某些情况下,这是不可取的。
这是我最近经常遇到的事情。我应该从单个项目的多个请求中抓取数据。
我一直在像这样使用请求元来累积请求之间的数据;
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})
使用这种方法,您每次只需发送一件物品本身。在某些情况下,这是不可取的。