这是我最近经常遇到的事情。我应该从单个项目的多个请求中抓取数据。
我一直在使用请求元在这样的请求之间累积数据;
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
在最后一个解析方法中,我将刮除最终所需的数据并产生该项目。但是,这种方法对我来说很尴尬。有没有更好的方法来抓取像这样的网页?还是我做得正确?
答案 0 :(得分:2)
这是一个非常常规和正确的方法,请记住,scrapy是异步框架。 如果您希望使用更简单的代码结构,可以使用scrapy-inline-requests
但是从我的角度来看,与使用meta
相比,这将需要更多的麻烦。
答案 1 :(得分:1)
这是在整个请求中跟踪商品的正确方法。我实际上会做的就是改变项目值,就像这样:
item['foo'] = bar
item['bar'] = foo
yield scrapy.Request(url, callback=self.parse, meta={'item':item})
使用这种方法,您每次只需发送一件物品本身即可。在某些情况下,这是不可取的。