2017-10-20 2 views
-1

So habe ich es geschafft, eine Spinne zu schreiben, die die Download-Links von "Videos" und "Englisch Transkripte" aus dieser site extrahiert. Wenn ich auf das cmd-Fenster schaue, kann ich sehen, dass alle korrekten Informationen abgekratzt wurden.Python Scrapy - erste Elemente und Elemente aus dem Rückruf an CSV

Das Problem, das ich habe, ist, dass die Ausgabe CSV-Datei enthält nur die "Video" -Links und nicht die "Englisch Transkripte" Links (obwohl Sie sehen können, dass es im Cmd-Fenster geschabt wurde).

Ich habe ein paar Vorschläge aus anderen Posts versucht, aber keiner von ihnen scheint zu funktionieren.

Das folgende Bild ist, wie ich die Ausgabe so aussehen möchte: CSV Output Picture

dies ist mein aktuelle Spinne Code:

import scrapy 

class SuhbaSpider(scrapy.Spider): 
    name = "suhba2" 
    start_urls = ["http://saltanat.org/videos.php?topic=SheikhBahauddin&gopage={numb}".format(numb=numb) 
     for numb in range(1,3)] 

    def parse(self, response): 
     yield{ 
      "video" : response.xpath("//span[@class='download make-cursor']/a/@href").extract(), 
     } 
     fullvideoid = response.xpath("//span[@class='media-info make-cursor']/@onclick").extract() 

     for videoid in fullvideoid: 
      url = ("http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2]) 
      yield scrapy.Request(url, callback=self.parse_transcript) 

    def parse_transcript(self, response): 
     yield{ 
      "transcript" : response.xpath("//a[contains(@href,'english')]/@href").extract(), 
     } 
+0

Mögliche Duplikat [Scrapy CSV-Ausgabe "zufällig" fehlenden Felder] (https://stackoverflow.com/questions/41917108/scrapy-csv-output-randomly-missing -fields) –

Antwort

0

Du wodurch man zwei verschiedene Arten von Produkten - eine, die nur video Attribut und eines mit nur transcript Attribut. Sie müssen eine Art von Item liefern, die aus beiden Attributen besteht. Dazu müssen Sie einen Artikel in parse erstellen und ihn an die zweite Ebene mit meta übergeben. Dann, in der parse_transcript, nehmen Sie es von meta, füllen Sie zusätzliche Daten und schließlich den Artikel. Das allgemeine Muster ist in Scrapy documentation beschrieben.

Die zweite Sache ist, dass Sie alle Videos auf einmal mit extract() Methode extrahieren. Dies ergibt eine Liste, in der es schwierig ist, jedes einzelne Element mit dem entsprechenden Transkript zu verknüpfen. Ein besserer Ansatz besteht darin, jedes einzelne Videoelement im HTML- und Yield-Element für jedes Video zu durchlaufen.

zu Ihrem Beispiel Beworben:

import scrapy 

class SuhbaSpider(scrapy.Spider): 
    name = "suhba2" 
    start_urls = ["http://saltanat.org/videos.php?topic=SheikhBahauddin&gopage={numb}".format(numb=numb) for numb in range(1,3)] 

    def parse(self, response): 
     for video in response.xpath("//tr[@class='video-doclet-row']"): 
      item = dict() 
      item["video"] = video.xpath(".//span[@class='download make-cursor']/a/@href").extract_first() 

      videoid = video.xpath(".//span[@class='media-info make-cursor']/@onclick").extract_first() 
      url = "http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2] 
      request = scrapy.Request(url, callback=self.parse_transcript) 
      request.meta['item'] = item 
      yield request 

    def parse_transcript(self, response): 
     item = response.meta['item'] 
     item["transcript"] = response.xpath("//a[contains(@href,'english')]/@href").extract_first() 
     yield item 
+0

Das wäre misstrauisch, denn es würde Anfragen nach 'ajax_transcription.php' für Videos ohne Transkriptionen geben. Es ist wichtig, dass sich dein Spider genau so verhält wie die Site. Das heißt, Sie müssen das Vorhandensein von Transkriptionen durch Selektoren überprüfen und nur Anfragen an diejenigen stellen, die sie haben. –

+0

Außerdem würde ich empfehlen, 'X-Requested-With' Header mit' XMLHttpRequest' hinzuzufügen. Gleicher Grund. –

+0

Ich versuchte, ein Beispiel zu geben, das Hauptideen anwendet, nicht bereit-zu-laufen Code. Das Überprüfen der Site-Details obliegt dem OP. –

Verwandte Themen