Python scrapy - 从回调到csv产生初始项和项

时间:2017-10-20 16:10:43

标签: python-2.7 scrapy export-to-csv scrapy-spider

所以我设法写了一个蜘蛛,从这个site中提取“视频”和“英语成绩单”的下载链接。查看cmd窗口,我可以看到所有正确的信息都已被删除。

我遇到的问题是输出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(),
        }

1 个答案:

答案 0 :(得分:0)

您正在产生两种不同的项目 - 一项仅包含video属性,另一项仅包含transcript属性。您必须生成一种由两个属性组成的项目。为此,您必须在parse中创建项目,并使用meta将其传递给第二级请求。然后,在parse_transcript中,您从meta获取,填写其他数据,最后生成该项目。一般模式在Scrapy documentation中描述。

第二件事是您使用extract()方法一次性提取所有视频。这产生了一个列表,之后很难将每个单独的元素与相应的成绩单链接起来。更好的方法是循环HTML中的每个单独的视频元素并为每个视频生成项目。

应用于您的示例:

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