Scrapy 动态创建 Item
转载自:https://zhuanlan.zhihu.com/p/72711337
背景
当我们在爬取网站的时候,可能会出现这么一种情况:我们并不能完全确定该网站的所有字段。即是说,我们的 item 是动态的。但是,使用 scrapy 的时候我们往往都是先定义的 item ,处理了所有字段。通过研读 scrapy 的官方文档,我得到了下面的解决方法。
下面是代码和解释(爬虫文件)
1 from scrapy import Item,Field 2 # ItemLoader 是解决的核心 3 from scrapy.loader import ItemLoader 4 5 class xxxxx(scrapy.Spider): 6 def parse(self, response): 7 # 初始化一个目标 item 实例 8 item = Item() 9 item_l = ItemLoader(item=item) 10 # 添加 a 字段 (动态字段例子) 11 item.fields['a'] = Field() 12 # 为 a 字段赋值 13 item_l.add_value('a', '11') 14 # 查看是否创建动态字段成功 15 # 正式使用爬虫时将 print 更换为平时使用的 yield 16 print(item_l.load_item())
本文使用的 add_value 为(字段名,字段值)形式,ItemLoader 更多用法请查看官方文档!
https://link.zhihu.com/?target=https%3A//docs.scrapy.org/en/latest/topics/loaders.html
此外,想要动态创建字段的话,其实并不必使用 ItemLoader
ItemLoader 其实比较适用于同一个字段可能出现多个值的情况
因为 ItemLoader 直接将目标字段弄成了一个列表
简易动态创建 item 字段可以直接如下
1 from scrapy import Item,Field 2 class xxxxx(scrapy.Spider): 3 def parse(self, response): 4 # 初始化一个目标 item 实例 5 item = Item() 6 # 添加 a 字段 (动态字段例子) 7 item.fields['a'] = Field() 8 # 为 a 字段赋值 9 item['a']= '123' 10 # 查看是否创建动态字段成功 11 # 正式使用爬虫时将 print 更换为平时使用的 yield 12 print(item)
--------------------成功,肯定是需要一点一滴积累的--------------------