zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    MYSQL 大数据
    MYSQL 数据库优化
    原始代理需要改进的地方
    JDK动态代理
    使用CGLIB生成代理
    Spring
    Struts2面试题
    hibernate面试题
    Mac下创建隐藏用户
  • 原文地址:https://www.cnblogs.com/GouQ/p/13328824.html
Copyright © 2011-2022 走看看