Python 2.7 Python scrapy-生成初始项和从回调到csv的项
因此,我成功地编写了一个蜘蛛程序,从中提取“视频”和“英语成绩单”的下载链接。看着cmd窗口,我可以看到所有正确的信息都被删除了 我遇到的问题是,输出csv文件只包含“视频”链接,而不包含“英文成绩单”链接(即使您可以看到它已在cmd窗口中被刮取) 我试过其他帖子的一些建议,但似乎都不管用 下图是我希望输出的样子: 这是我当前的spider代码: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
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感谢您的解释和解决方案,它工作得非常完美@安德烈·斯佩雷斯·阿尔贝拉。谢谢你的建议,我没有想到这些,我一定会加进去的