2017-10-20 110 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。 –