一个在IT行业摸爬打滚的程序猿

0%

Scrapy少写yield坑

当你重写start_requests方法的时候,使用scrapy.Request(xxx)后记得前面一定要加上yield,不然报错说是NoneType不是一个可迭代对象

1.报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
Traceback (most recent call last):
File "E:\apps\anaconda3\lib\site-packages\twisted\internet\defer.py", line 1418, in _inlineCallbacks
result = g.send(result)
File "E:\apps\anaconda3\lib\site-packages\scrapy\crawler.py", line 87, in crawl
start_requests = iter(self.spider.start_requests())
TypeError: 'NoneType' object is not iterable
2020-02-27 14:20:59 [twisted] CRITICAL:
Traceback (most recent call last):
File "E:\apps\anaconda3\lib\site-packages\twisted\internet\defer.py", line 1418, in _inlineCallbacks
result = g.send(result)
File "E:\apps\anaconda3\lib\site-packages\scrapy\crawler.py", line 87, in crawl
start_requests = iter(self.spider.start_requests())
TypeError: 'NoneType' object is not iterable

2.正确使用:

1
2
3
4
5
6
7
8
9
10
11
12
# start_urls = ['http://xxx/xxx/']

base_url = "http://xxx/xxx/{}?page={}"
key_worlds = [xxx, xxx, xxx]

def start_requests(self):
for k in self.key_worlds:
yield scrapy.Request(
url=self.base_url.format(k, 1),
meta={"key": k},
callback=self.parse,
)

3.错误使用:

1
2
3
4
5
6
7
8
9
10
11
12
# start_urls = ['http://xxx/xxx/']

base_url = "http://xxx/xxx/{}?page={}"
key_worlds = [xxx, xxx, xxx]

def start_requests(self):
for k in self.key_worlds:
scrapy.Request(
url=self.base_url.format(k, 1),
meta={"key": k},
callback=self.parse,
)

鄙人粗心大意,就一个yield之差,排查了十几二十分钟。。。。

数学老师常教我们==等效替换==

  • 在这里我们也可以。可以使用列表推导式来代替这个;

  • 反正都是建立一系列的初始化请求,然后放到队列里面自动去请求,然后执行调用指定的回调函数,没有指定的话,默认是回调self.parse函数,下面来等价的将上面的代码换一下:

描述:如果你细心的话,你可以注意到我刚刚前面给的代码,有注释一行# start_urls = ['http://xxx/xxx/']

刚刚上面的代码可以使用下面的代码来替换,是不是很简单???

(PS:但是有一点不一样的就是,meta信息没有传递过去,但这里你可以通过url那个关键词来获取,也是可以滴)

1
2
3
4
base_url = "http://xxx/xxx/{}?page={}"
key_worlds = [xxx, xxx, xxx]

start_urls = [base_url.format(k, 1) for k in key_worlds]

至此本文踩坑记录写完了,希望能够帮助到各位在爬虫路上的小伙伴们,觉得不错点个赞呗
感谢认真读完这篇教程的您

先别走呗,这里有可能有你需要的文章:

CSS字体反爬实战,10分钟就能学会
爬虫:js逆向目前遇到的知识点集合;
woff字体反爬实战,10分钟就能学会;
爬虫js解密分析:某某猫小说;
爬虫js解密分析:某某云文学;
个人总结-js逆向解析思路;
woff字体反爬实战,10分钟就能学会(ttf字体同理);