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)

 

posted @ 2020-07-17 11:27  牛公的跑奔  阅读(570)  评论(0编辑  收藏  举报
总访问量:AmazingCounters.com