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

时间:2019-07-15 09:47:36

标签: python web-scraping request scrapy meta

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

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

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

在最后一个解析方法中,我将刮除最终所需的数据并产生该项目。但是,这种方法对我来说很尴尬。有没有更好的方法来抓取像这样的网页?还是我做得正确?

2 个答案:

答案 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})

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