我尝试使用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对象仍为空
答案 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