• 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)
  • 相关阅读:
    关于排列组合与分配问题
    Stirling数
    UVA 294 求约数的个数
    Linux中profile与bashrc的作用
    一致性哈希(consistent hashing)算法
    TCP三次握手与四次挥手
    MySQL查询昨天、今天、7天、近30天、本月、上一月数据
    java基础-注解Annotation原理和用法
    java基础-浅复制与深复制的理解
    Linux命令行提示符设置
  • 原文地址:https://www.cnblogs.com/GouQ/p/13328824.html
Copyright © 2020-2023  润新知