Scrapy - 进一步深入网站的问题

时间:2018-03-12 21:42:13

标签: python scrapy

我尝试抓取的网站具有以下结构:

  • 有各种模块(我为其生成没有问题的链接) - 让我们称之为“module_urls”
  • 每个模块页面都有一个随机数量的链接到各个带有视频的页面(让我们称之为“lesson_urls”)
  • 每个页面都有一个视频

想法是打印所有视频的链接。

我已经成功地分别管理:(1)生成module_urls,(2)抓取指向lesson_urls的链接,以及(3)抓取视频。但是,我正在努力创建适当的循环以使它们一起工作。

以下脚本正确生成module_urls,但是,与我的预期相反,永远不会满足抓取每个网址(然后抓取每个子网址)的请求。我确信这来自于我对该主题的纯粹无知 - 这是我第一次尝试使用Scrapy。

非常感谢你的帮助!

video_links = []
def after_login(self, response):
    module_urls = self.generate_links()
    for module_url in module_urls:
        print("This is one module URL: %s" % module_url)
        Request(module_url, self.get_lesson_urls)
    print(self.video_links)

def get_lesson_urls(self, response):
    print("Entered get_lesson_urls")
    urls = response.xpath('//*[starts-with(@id,"post")]//li/a/@href').extract()
    for lesson_url in urls:
        Request(lesson_url, self.get_video_link)

def get_video_link(self, response):
    video_address = response.xpath('//*[starts-with(@id, "post")]//iframe[@name = "vooplayerframe"]/@src').extract_first()
    self.video_links.append(video_address)

1 个答案:

答案 0 :(得分:0)

我相信你需要提出你的请求对象

video_links = []
def after_login(self, response):
    module_urls = self.generate_links()
    for module_url in module_urls:
        print("This is one module URL: %s" % module_url)
        yield Request(module_url, self.get_lesson_urls)

def get_lesson_urls(self, response):
    print("Entered get_lesson_urls")
    urls = response.xpath('//*[starts-with(@id,"post")]//li/a/@href').extract()
    for lesson_url in urls:
        yield Request(lesson_url, self.get_video_link)

def get_video_link(self, response):
    video_address = response.xpath('//*[starts-with(@id, "post")]//iframe[@name = "vooplayerframe"]/@src').extract_first()
    yield video_address

编辑: 而不是打印,如果您随后生成所需的URL,您可以使用以下命令将它们输出为json(和其他格式):

scrapy crawl myspider -o data.json

您可以使用Scrapy的项目管道进一步解析:https://doc.scrapy.org/en/latest/topics/item-pipeline.html