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

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: