2017-10-20 138 views
-1

因此,我設法編寫了一個蜘蛛,從這個site中提取「視頻」和「英文抄本」的下載鏈接。看着cmd窗口,我可以看到所有正確的信息都被刮掉了。Python scrapy - 從回調到csv產生初始項目和項目

我遇到的問題是,輸出CSV文件只包含了「視頻」鏈接,而不是「英語成績單」鏈接(即使你可以看到它在cmd窗口被刮掉)。

我已經嘗試了其他帖子的一些建議,但他們都沒有工作。

下面的圖片是我想怎麼輸出看起來像: CSV Output Picture

這是我目前的蜘蛛代碼:

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

[Scrapy CSV輸出 「隨機」 缺場(可能的重複https://stackoverflow.com/questions/41917108/scrapy-csv-output-randomly-missing - 場) –

回答

0

你產生兩種不同類型的項目 - 包含一個只是video屬性和一個只包含transcript屬性。你必須產生一種由兩個屬性組成的項目。爲此,您必須在parse中創建項目,並使用meta將其傳遞給二級請求。然後,在parse_transcript中,您從meta中獲取它,填充其他數據並最終生成該項目。一般模式在Scrapy documentation中描述。

第二件事是您使用extract()方法一次提取所有視頻。這產生了一個列表,其中很難將每個單獨的元素與相應的轉錄本鏈接起來。更好的方法是循環HTML中的每個單獨的視頻元素併爲每個視頻生成yield項。

適用於你的例子:

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

這將是可疑的,因爲會有請求'ajax_transcription.php'的視頻沒有轉錄。蜘蛛的行爲與網站完全一樣,這很重要。也就是說,你必須通過選擇器檢查轉錄的存在,並只向那些有它們的人提出請求。 –

+0

另外,我建議用'XMLHttpRequest'添加'X-Requested-With'頭文件。同樣的道理。 –

+0

我試圖提供一個應用主要思想的例子,而不是提供隨時可以運行的代碼。檢查現場細節取決於OP。 –