2017-10-04 12 views
0

Je ne veux pas utiliser la commande -o pour exporter csv mais le créer à partir de mon scrapy script. Mon fichier csv s'exporte bien avec des éléments, mais je n'ai pas l'en-tête. Je voudrais avoir un en-tête correspondant aux touches de mes objets.Scrapy - Comment exporter un fichier cvs avec la clé de l'élément dans l'en-tête

  • Comment réparer un en-tête avec des clés d'éléments?

J'ai vu dans plusieurs forums et tutoriels que l'en-tête doit être défini dans pipelines.py. J'ai essayé différentes solutions avec open_spiders mais cela n'a pas fonctionné.

Voici mon code pipelines.py:

class CsvWriterPipeline(object): 
    def __init__(self): 
     self.csvwriter = csv.writer(open(fichier1, 'wb')) 

    def open_spider(self, spider): 
     header_keys = item.fields.keys() 
     self.csvwriter.writerow(header_keys) 

    def process_item(self, item, spider): 
     self.csvwriter.writerow(
      [item['nom_course'][0], 
      item['nom_evenement'][0], 
      item['distance'][0], 
      item['date'][0], 
      item['contact_1'][0], 
      item['contact_2'][0], 
      item['organisateur'][0], 
      item['site_internet_evenement'][0], 
      item['description'][0], 
      item['prix'][0], 
      item['nb_participant'][0], 
      item['URL_Even'][0], 
      item['pays'][0], 
      item['region'][0], 
      item['ville'][0], 
      item['tag'][0]]) 
     return item 

settings.py

BOT_NAME = 'AHOTU_V2' 

SPIDER_MODULES = ['AHOTU_V2.spiders'] 
NEWSPIDER_MODULE = 'AHOTU_V2.spiders' 
ITEM_PIPELINES = { 
    'AHOTU_V2.pipelines.CsvWriterPipeline': 800, 
} 

ROBOTSTXT_OBEY = True 
+0

Avez-vous activé le pipeline aussi dans 'settings.py'? Quel problème rencontrez-vous? –

+0

Oui J'ai activé le pipeline dans settings.py (j'ai ajouté le code). Mon problème est que mon csv est exporté avec des éléments, mais je n'ai pas d'en-tête. Je voudrais créer un en-tête avec les clés des éléments. – VioGeo

Répondre

1

Lorsque vous ouvrez votre araignée il n'y a aucun élément du tout. Donc, ci-dessous fonction ne fonctionne pas

def open_spider(self, spider): 
    header_keys = item.fields.keys() 
    self.csvwriter.writerow(header_keys) 

Ce que vous devriez plutôt faire est d'avoir un champ pour vérifier si les en-têtes sont écrits ou non

class CsvWriterPipeline(object): 
    def __init__(self): 
     self.csvwriter = None 
     self.headers_written = False 

    def open_spider(self, spider): 
     self.csvwriter = csv.writer(open(fichier1, 'wb')) 

    def process_item(self, item, spider): 
     if not self.headers_written: 
      header_keys = item.fields.keys() 
      self.csvwriter.writerow(header_keys) 
      self.headers_written = True 

     self.csvwriter.writerow(
      [item['nom_course'][0], 
      item['nom_evenement'][0], 
      item['distance'][0], 
      item['date'][0], 
      item['contact_1'][0], 
      item['contact_2'][0], 
      item['organisateur'][0], 
      item['site_internet_evenement'][0], 
      item['description'][0], 
      item['prix'][0], 
      item['nb_participant'][0], 
      item['URL_Even'][0], 
      item['pays'][0], 
      item['region'][0], 
      item['ville'][0], 
      item['tag'][0]]) 
     return item 
+0

Cela fonctionne parfaitement! Merci ! – VioGeo