请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在解析的过程,有多个url被yield跟进爬取时,如何保证都解析完成,才被yield给pipelines

老师,如下图,在解析的过程中,有多个被yield出去的url, 我现在是 callback=self.parse_celebrities 的 parse_celebrities方法中yield yield movie_item交给pipelines。
发现 【获奖情况】 获 【短评】的信息还没被解析完,就执行到pipelines了,导致最终保存时数据缺失,对于这种情况,如何保证都解析完了,才会提交到pipelines呢?图片描述

正在回答 回答被采纳积分+3

1回答

bobby 2019-12-27 11:38:39

只有yield出去item的时候才会进入pipeline,你这里是yield的request是不会进入pipeline的,获奖短评是在parse_celebrities中解析的吗?

0 回复 有任何疑惑可以回复我~
  • 提问者 慕尼黑7546459 #1
    老师,是这样,parse_detail的逻辑主要包含:
    1、解析基本信息。通过传入的response参数就可以获取。
    2、跟进爬取【获奖情况】,他的解析是callback= parse_awards 方法中完成
    3、跟进爬取【短评】,他的解析是callback= parse_comments 方法中完成
    4、跟进爬取【演职员】,他的解析是callback= parse_celebrities 方法中完成。 并在这个方法的最后 我通过 yield movie_item 提交item给pipeline
    
    现在的问题,因为步骤 2、3、4 是异步的,可能出现步骤4已经执行完成了就直接被 yield item出去了,然而2、3还没完成呢,导致yield item没有包含步骤2、3的数据。
    
    所以,对于这种情况,如果保证 1、2、3、4都全部完成(就是异步转同步等待),才真正被提交给pipelines呢?
    
    PS: 步骤1、2、3、4的数据是共用一个item的,当成一条记录存到mongo中。
    回复 有任何疑惑可以回复我~ 2019-12-27 14:24:33
  • bobby 回复 提问者 慕尼黑7546459 #2
    这个简单啊,你在parse_detail中将获奖情况的解析交给callback= parse_awards ,但是跟进爬取【短评】应该在parse_awards 中完成也就是抓取完获奖情况后才抓取短评,后续的演员表也是应该在parse_comments 解析完成以后才能进行。最后的item在parse_celebrities 之后进行,这样就能保证顺序了
    回复 有任何疑惑可以回复我~ 2019-12-29 12:17:34
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信