【问题标题】:Scrapy dynamic creation of objects + json exportScrapy动态创建对象+json导出
【发布时间】:2013-04-15 09:33:07
【问题描述】:

我创建了一个新的蜘蛛来抓取网站。 这个爬虫获取网站上liste的每个视频游戏并为其创建一个对象:

class gameInfos(Item):
    title = Field()
    desc = Field()
    kind = Field()

对于每个游戏,网站都包含一个可变的经销商列表。我得到了对象中的每个经销商:

class buyInfos(Item):
    name = Field()
    address = Field()
    price = Field()

现在,我的问题:

我想将 buyInfos 对象放入 gameInfos 对象中,并且我的 json 文件看起来:

[
   {
    "title": "BF3",
    "desc": "a beautiful game",
    "kind" : "FPS",
    "buy" : 
           [
              {name : "cdiscount", "address" : "example", "price" : "45 €"},
              {name : "amazon", "address" : "example amazon", "price" : "40 €"},
               //... other resellers
           ]
   },
   {
    "title": "COD 42",
    "desc": "a game",
    "kind" : "FPS",
    "buy" :
   }, 
   //... other games
]

所以我尝试在我的主对象中创建一个对象。它可以工作,但最后,我只有一个要填充的对象,而我想在我的主对象中创建一些对象。

感谢您的帮助

【问题讨论】:

    标签: python json scrapy


    【解决方案1】:

    解决方案很简单。创建一个对象为:

    class GameInfo(Item):
        title = Field()
        desc = Field()
        kind = Field()
        listeBuys = Field()
    

    然后,在您的蜘蛛中,实例 GameInfo:

    gameInfo = GameInfo()
    

    然后,所需字段的实例 python 列表:

    gameInfo['listeBuys'] = []
    

    最后,随意添加:

    gameInfo['listeBuys'].append(asyouwant)
    

    感谢 dm03514 的帮助!

    【讨论】:

      【解决方案2】:

      Scrapy Field 类是 dict 的子类。如果您想让其中一个字段能够包含Items 的列表,我相信您可以创建一个列表字段。

      class ListField(list):
        pass
      
      class GameInfo(Item):
          title = Field()
          desc = Field()
          kind = Field()
          buys = ListField()
      

      现在您可以在您的蜘蛛中创建gameInfos,它将能够包含所有相关的buyInfos

      game_info = GameInfo()
      # create your buy info and append to game info
      game_info['buys'].append(new_buy_info)
      

      【讨论】:

      • 感谢您的回答,但我有一个问题。我像你一样创建了“ListField”,并在我的主对象中添加了一个字段“infos = ListField()”。

        然后,在我的蜘蛛中:我创建了我的主对象 (game_info = GameInfo()) 和我的子对象。
        之后,我尝试:
        game_info.append(new_buy_info)
        但是错误来了 =>

        game_info.append(subObject) File "/usr/lib/python2.7/site-packages/scrapy/item.py", line 64, in __getattr__ raise AttributeError(name) exceptions.AttributeError: append
      • @user2240632 抱歉固定示例
      • 我收到一个错误:File "/root/mycrawler/mycrawler/spiders/jiwire.py", line 107, in parse_hotspot game_info["buys"].append("test") File "/usr/lib/python2.7/site-packages/scrapy/item.py", line 49, in __getitem__ return self._values[key] exceptions.KeyError: 'buys'
      • @user2240632 来吧,您必须将答案中的概念适应您的实际代码。 buys 指的是您将 ListField 分配给的任何键。在你的另一篇文章中,你说它是info
      • 对不起,我不明白。我必须在我的列表对象中添加字段吗? (as class ListField(list): field = subObject())
      猜你喜欢
      • 2016-10-02
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2023-02-09
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多