web-dev-qa-db-fra.com

Scrapy: AttributeError: l'objet 'list' n'a pas d'attribut 'iteritems'

Ceci est ma première question sur le débordement de pile. Récemment, je veux utiliser linked-in-scraper , alors j'ai téléchargé et chargé "scrapy crawl linkedin.com" et obtenir le message d'erreur ci-dessous. Pour votre information, j'utilise anaconda 2.3.0 et python 2.7.11. Tous les packages associés, y compris scrapy et six, sont mis à jour par pip avant l'exécution du programme. 

Traceback (most recent call last):
  File "/Users/byeongsuyu/anaconda/bin/scrapy", line 11, in <module>
    sys.exit(execute())
File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/cmdline.py", line 108, in execute
settings = get_project_settings()
File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/utils/project.py", line 60, in get_project_settings
settings.setmodule(settings_module_path, priority='project')
File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 285, in setmodule
self.set(key, getattr(module, key), priority)
  File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 260, in set
self.attributes[name].set(value, priority)
  File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 55, in set
value = BaseSettings(value, priority=priority)
  File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 91, in __init__
self.update(values, priority)
  File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 317, in update
for name, value in six.iteritems(values):
  File "/Users/byeongsuyu/anaconda/lib/python2.7/site-packages/six.py", line 599, in iteritems
return d.iteritems(**kw)

AttributeError: 'list' object has no attribute 'iteritems'

Je comprends que cette erreur provient de d n’est pas le type de dictionnaire mais le type de liste. Et puisque l’erreur provient du code de scrapy, c’est peut-être un problème de paquet scrapy ou de six paquetages. Comment puis-je essayer de corriger cette erreur?

EDIT: C'est le code de scrapy.cfg

  # Automatically created by: scrapy start project
  #
  # For more information about the [deploy] section see:
  # http://doc.scrapy.org/topics/scrapyd.html
  [settings]  
  default = linkedIn.settings

   [deploy]
   #url = http://localhost:6800/
   project = linkedIn
16
user124697

Cela est dû au settings [] du racleur associé:

ITEM_PIPELINES = ['linkedIn.pipelines.LinkedinPipeline']

Cependant, ITEM_PIPELINES est supposé être un dict, selon le doc :

Pour activer un composant Item Pipeline, vous devez ajouter sa classe au paramètre ITEM_PIPELINES, comme dans l'exemple suivant:

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

Les valeurs entières que vous affectez aux classes dans ce paramètre déterminent l'ordre dans lequel elles s'exécutent: les éléments passent des classes les plus basses aux plus hautes. Il est de coutume de définir ces nombres dans la plage 0-1000.

Selon this question , il s’agissait d’une liste, ce qui explique pourquoi ce scraper utilise une liste . Vous devrez donc demander à votre développeur de mettre à jour son code, ou de définir ITEM_PIPELINES. toi même.

30
Valentin Lorentz

La réponse courte est que ITEM_PIPELINES doit être un dictionnaire et non une liste avec la clé comme classe de pipeline et un entier qui détermine l’ordre dans lequel ils sont exécutés: les éléments passent des classes les plus basses aux plus hautes. Il est de coutume de définir ces nombres dans la plage 0-1000. comme expliqué par @valentin Lorentz

0
Buhiire Keneth