关于scrapy爬虫时,由spider文件将item传递到管道的方法注意事项

1问题描述

在自学scrapy框架爬虫时,发现某一网页数据中有若干个li或者ul标签,而这些标签中的文本或者属性就是自己需要的,无需渗透到相应的每一个标签内的链接中,再跳转到对应的页面进行爬取,根据自学内容发现,每次从spider使用return传递到pipeline中的数据形式是一个item,即字典形式,因此问题来了,对于上面的情况:
(1)希望能够使用一个列表的形式一起传递到管道中才方便,但是scrapy中注定不能传递一个列表嵌套任意个字典。
(2)如果对解析的页面ul或者li标签进行for遍历,却无法使用return方法,因为,每次这么使用只会将第一个li或者ul标签内容返回到管道中进行处理,即最终结果只能是在数据库中存储每个页面的第一个li或者ul标签内容。

2解决方法

对于上面的问题1,笔者认为可以在spider文件中直接将当前页面的全部li或者ul标签内容的item字典形式再存储一个字典中,即{a:{1:1,2:2…},b:{1:1,2:2…}…},
然后再经过return这个整合的item,将这个item传递到pipeline中,当然需要在对应的管道方法中对这个整合的item进行遍历一个一个再发给管道其他方法进行处理。
对于上面的问题2,可以使用yield来代替return,因为return方法的特性,直接终止当前的程序,因此导致了for循环的停止迭代,使用yield方法就能够很好的避免这个问题,笔者最终使用了这个方法来处理,话不多说,贴代码:
关于scrapy爬虫时,由spider文件将item传递到管道的方法注意事项
注意下面的yield info,这里就是直接遍历了当前页面的全部li标签后,使用了yield代替return方法实现了既不用渗透到每一个li标签的链接中,又能保有return到管道的效果