所以我设法写了一个蜘蛛,从这个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(),
}
答案 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