【python|scrapy】yield scrapy.Request在自定义函数中调用没有执行

every blog every motto: You can do more than you think.

0. 前言

在这里插入图片描述

事与愿违,给自己挖了一个坑。。。。
记之

1. 正文

1.1 原始代码

原始代码是可以正常执行的,如下:

def parse(self, response):
    print('------------------------------')
    print('---------这里是若干代码---------')
    print('------------------------------')

    print('-------------1-----------------')

    yield scrapy.Request(new_url, callback=self.parse_res, cookies=self.cookie,
                         meta={'item': copy.deepcopy(item)})
    print('-------------2-----------------')

1.2 修改后

为了让代码整洁点,对部分代码进行了封装,如下:

def p2p(self):
    """code blokc"""
    print('-------------1-----------------')
    yield scrapy.Request(new_url, callback=self.parse_res, cookies=self.cookie,
                         meta={'item': copy.deepcopy(item)})
    print('-------------2-----------------')

def parse(self, response):
    print('------------------------------')
    print('---------这里是若干代码---------')
    print('------------------------------')
    
    self.p2p() 

遗憾的是,现在p2p不能运行了。。。。。

1.3 解决方法

参考文章1

yield必须出现在response的方法内部

即对也不对,怎么说?按他说的确实能解决问题,但算是歪打正着,
因为,有response参数这个函数是什么函数?对,没错是回调函数,所以,自然而然能执行yield scrapy.Ruquest。

然而实际上,我们上面的封装,把p2p变成了生成器,普通的调用是不行的。

只要改变调用方法就行,如下:

def parse(self, response):
    print('------------------------------')
    print('---------这里是若干代码---------')
    print('------------------------------')

    yield from self.p2p()

原文评论中,有相关争议,但是这种方案解决了笔者遇到的问题,遂没有深究,有知道的小伙伴可以指点一二。

参考

[1] https://blog.csdn.net/weixin_40976261/article/details/88626108
[2] https://segmentfault.com/q/1010000020953217

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡侃有料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值