Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python scrapy-生成初始项和从回调到csv的项_Python 2.7_Scrapy_Export To Csv_Scrapy Spider - Fatal编程技术网

Python 2.7 Python scrapy-生成初始项和从回调到csv的项

Python 2.7 Python scrapy-生成初始项和从回调到csv的项,python-2.7,scrapy,export-to-csv,scrapy-spider,Python 2.7,Scrapy,Export To Csv,Scrapy Spider,因此,我成功地编写了一个蜘蛛程序,从中提取“视频”和“英语成绩单”的下载链接。看着cmd窗口,我可以看到所有正确的信息都被删除了 我遇到的问题是,输出csv文件只包含“视频”链接,而不包含“英文成绩单”链接(即使您可以看到它已在cmd窗口中被刮取) 我试过其他帖子的一些建议,但似乎都不管用 下图是我希望输出的样子: 这是我当前的spider代码: import scrapy class SuhbaSpider(scrapy.Spider): name = "suhba2" s

因此,我成功地编写了一个蜘蛛程序,从中提取“视频”和“英语成绩单”的下载链接。看着cmd窗口,我可以看到所有正确的信息都被删除了

我遇到的问题是,输出csv文件只包含“视频”链接,而不包含“英文成绩单”链接(即使您可以看到它已在cmd窗口中被刮取)

我试过其他帖子的一些建议,但似乎都不管用

下图是我希望输出的样子:

这是我当前的spider代码:

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(),
        }

您将生成两种不同类型的项—一种仅包含
视频
属性,另一种仅包含
转录本
属性。您必须生成一种由两个属性组成的项。为此,您必须在
parse
中创建项,并使用
meta
将其传递给第二级请求。然后,在
parse_transcript
中,从
meta
中获取它,填充其他数据并最终生成该项。中描述了一般模式

第二件事是使用
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

可能重复的内容是可疑的,因为会有人请求
ajax\u transcription.php
获取没有转录的视频。重要的是,您的蜘蛛的行为与站点完全相同。这就是说,您必须通过选择器检查是否存在转录,并且只向具有转录的选择器发出请求。此外,我建议使用
XMLHttpRequest
添加
X-request-With
标题。同样的原因。我试图提供一个应用主要思想的示例,而不是提供准备运行的代码。查看网站细节取决于OP.@TomášLinhart感谢您的解释和解决方案,它工作得非常完美@安德烈·斯佩雷斯·阿尔贝拉。谢谢你的建议,我没有想到这些,我一定会加进去的