关于yield和return的问题

来源:6-18 知乎spider爬虫逻辑的实现以及answer的提取 - 2

Liangruuu

2018-11-26

http://img.mukewang.com/szimg/5bfb463900019a1e08230555.jpg

老师关于这里的yield和return,为什么上面的函数是一个return list,而下面的函数直接由可以yield 一个request请求,如果把上面的return list改为

yield scrapy.FormRequest(
            url=post_url,
            formdata=post_data,
            headers=self.headers,
            callback=self.check_login
        )

或者把下面的yield改成

return [scrapy.Request(url, dont_filter=True, headers=self.headers)]

这样行吗?

写回答

1回答

bobby

2018-11-26

如果你对python的生成器了解的话 就会知道这里实际上都是可以的, 有yield的方法返回的是一个生成器对象。生成器对象是可以进行for循环调用的,如果一个函数返回的是一个list, list也是可以进行for循环的,python的设计思想就是脱离了类型的概念,比如python不会判断你return的是生成器对象还是list对象或者是dict对象,scrapy只会在返回的对象上进行for循环,所以只要你返回的对象可以for循环就行了,但是for循环产生的对象必须是item或者request对象不然scrapy会报错的

1
2
bobby
回复
dongnanzhy
不是的 生成器函数 也是可以return的 但是return之后该方法就结束了, 不能进行for循环进行执行了
2018-12-21
共2条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程