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
好文阅读
发表评论