Scrapy技术咨询:如何让parse2向parse1返回函数执行结果
解决Scrapy中parse1获取parse2返回值的问题
嘿,我来帮你搞定这个问题!你现在遇到的核心问题是Scrapy的请求是异步的,直接用scrapy.Request没法立刻拿到parse2的返回值——你拿到的res只是个请求对象,不是parse2处理后的结果。下面给你两种实用的解决办法:
方法一:用cb_kwargs传递上下文(推荐,Scrapy 2.0+支持)
这种方式清晰直观,把parse1里需要传递的信息(比如原url、其他字段)通过cb_kwargs传给parse2,然后在parse2里把处理后的数据和这些上下文一起返回,这样最终的输出就包含了parse1和parse2的所有信息。
修改后的代码示例:
def parse1(self, response): for lst in response.css("tr.lst-rw"): url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first() if url is not None: full_url = response.urljoin(url) # 通过cb_kwargs传递原url给parse2 yield scrapy.Request( full_url, callback=self.parse2, cb_kwargs={"original_url": full_url} ) def parse2(self, response, original_url): # 提取parse2需要的内容 parsed_content = response.css('你需要的选择器').extract_first() # 返回包含原url和parse2结果的字典 yield { 'original_url': original_url, 'parse2_content': parsed_content }
方法二:用meta传递数据(兼容旧版Scrapy)
如果你的Scrapy版本比较老,不支持cb_kwargs,可以用meta字段来传递数据,原理和上面一样:
def parse1(self, response): for lst in response.css("tr.lst-rw"): url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first() if url is not None: full_url = response.urljoin(url) yield scrapy.Request( full_url, callback=self.parse2, meta={"original_url": full_url} ) def parse2(self, response): # 从meta里取出传递的原url original_url = response.meta.get('original_url') parsed_content = response.css('你需要的选择器').extract_first() yield { 'original_url': original_url, 'parse2_content': parsed_content }
特殊需求:在parse1中直接收集parse2的结果
如果你的需求是让parse1等待并收集所有parse2的结果(比如要聚合数据),可以用异步函数结合await,但这种方式会同步处理请求,降低爬取效率,谨慎使用:
async def parse1(self, response): all_results = [] for lst in response.css("tr.lst-rw"): url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first() if url is not None: full_url = response.urljoin(url) # 异步获取response res = await self.fetch(full_url) # 调用parse2处理并获取结果 parse2_result = next(self.parse2(res)) all_results.append(parse2_result) # 输出聚合后的结果 yield {'all_parsed_results': all_results}
通常第一种方法是最优解,既保留了Scrapy的异步效率,又能把parse1和parse2的数据完美关联起来。
内容的提问来源于stack exchange,提问作者Pat
相关产品推荐
相关产品推荐

