Scrapy - 如何从另一个解析函数中解析返回的字典

时间:2017-07-11 07:50:52

标签: python web-scraping scrapy web-crawler

我尝试使用parse作为中心集线器从其他解析函数中收集dicts,因为我需要使用多个URL和域但我似乎无法弄清楚如何获取所有数据成一本字典。以下是我尝试做的一个例子:

def parse(self, response):
    request_1 = scrapy.Request(domain_1_url, callback = parse_2)
    request_2 = scrapy.Request(domain_2_url, callback = parse_3)
    #unpacks the two dicts from the 2 requests and return them as 1 to the pipeline
    yield {**request_1, **request_2} #what I want to do, doesn't work because they are requests, not dicts

def parse_2(self, response):
    yield {'someKey': 'some value'}

def parse_3(self, response):
    yield {'someOtherKey': 'some more values'}

有没有我可以实现这个目标?或者有没有更好的方法来做到这一点,比如把所有东西都扔到管道上,然后把这些数据合并起来呢?

修改

我考虑过将Item对象传递给其他请求,认为在其他请求中修改它也会修改主解析中的那个,因为Python""对象调用"属性:

def parse(self, response):
    item = CustomItem()
    request_1 = scrapy.Request(domain_1_url, callback = parse_2)
    request_1.meta['item'] = item
    request_2 = scrapy.Request(domain_2_url, callback = parse_3)
    request_2.meta['item'] = item
    print(item) #still empty
    yield item

def parse_2(self, response):
    item = response.meta['item']
    item['someKey'] = 'some value'
    yield item

def parse_3(self, response):
    item = response.meta['item']
    item['someOtherKey'] = 'some more values'
    yield item

不太确定为什么这不起作用,但在调用2个请求后,parse()中的item对象仍为空

1 个答案:

答案 0 :(得分:1)

上述评论中针对解决方案的@TomášLinhart的信用

我最终做的是链接3个解析而不是使用一个作为中心枢纽。我真的不喜欢这个解决方案,因为parse_2和parse_3之间没有任何关系,他们每个人都会在我的情况下抓取不同的域名,所以如果有人有更优雅的解决方案,请随时回答

def parse(self, response):
    item = CustomItem()
    request_1 = scrapy.Request(domain_1_url, callback = parse_2)
    request_1.meta['item'] = item
    yield request_1

def parse_2(self, response):
    item = response.meta['item']
    item['someKey'] = 'some value'
    request_2 = scrapy.Request(domain_2_url, callback = parse_3)
    request_2.meta['item'] = item
    yield request_2

def parse_3(self, response):
    item = response.meta['item']
    item['someOtherKey'] = 'some more values'
    yield item