抓取一个音乐网站来获取它的歌词

时间:2017-01-13 15:41:38

标签: python python-2.7 web-crawler

我想抓取一个歌词网站:http://mp3.zing.vn/bai-hat/Vi-Anh-La-Soai-Ca-Dam-Vinh-Hung/ZW78EUE8.html来获取歌曲的名称,艺术家,流派和歌词。 然后我编写以下代码并将其保存为mp3_spider.py

import scrapy

class MP3Spider(scrapy.Spider):
    name = "mp3"
    start_urls = ['http://mp3.zing.vn/bai-hat/Vi-Anh-La-Soai-Ca-Dam-Vinh-Hung/ZW78EUE8.html']

def parse(self, response):
    yield
    {
        'song': response.css('.txt-primary h1::text').extract()[0],
        'artist': response.css('.artist-track-log a::text').extract()[0],
        'genre': response.css('.genre-track-log::text').extract()[0],
        'lyrics': response.css('.fn-content::text').extract()[0]
    }

我在命令行中运行它:

scrapy runspider mp3_spider.py -o mp3.json

但它什么也没有返回。 任何人都可以告诉我如何使它有效吗?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您的班级MP3Spider实际上并没有做任何事情,因为parse是一个独立的功能。如果你缩进parse以匹配这样的缩进,它至少会运行。

class MP3Spider(scrapy.Spider):
    name = "mp3"
    start_urls = ['http://mp3.zing.vn/bai-hat/Vi-Anh-La-Soai-Ca-Dam-Vinh-Hung/ZW78EUE8.html']

    def parse(self, response):
        yield
        {
            'song': response.css('.txt-primary h1::text').extract()[0],
            'artist': response.css('.artist-track-log a::text').extract()[0],
            'genre': response.css('.genre-track-log::text').extract()[0],
            'lyrics': response.css('.fn-content::text').extract()[0]
        }

答案 1 :(得分:0)

我冒昧地重新创建场景,除了之前的海报回答......缩进级别对于Python如何解释你的代码非常重要:做什么,不做下一次或之前做。另外:

 def parse(self, response):
        yield
        {
            'song': response.css('.txt-primary h1::text').extract()[0],#here
            'artist': response.css('.artist-track-log a::text').extract()[0]#here,
            'genre': response.css('.genre-track-log::text').extract()[0],#here
            'lyrics': response.css('.fn-content::text').extract()[0]#here
        }

请问您如何提出提取值?我假设你可能不会使用"抓狂的shell' your.com ...我假设因为插入你所拥有的它会告诉你范围.. = [0] ....不存在,至少对于所选择的路径。

我冒昧地修改你的代码..但是因为我不懂越南语 ,你可能不得不搞乱一些正则表达式。

提示:

  1. 虽然不一定重要,但是在抓取包含段落的内容时,最好选择使用逐项选择,在我的体验中,往往会使大型文本的分组更容易,而且需要的正则表达式更少。

  2. 习惯使用Scrapy shell函数并在那里进行所有路径选择。如果你使用它会使你花费很多时间并且养成一个非常第一的类型视图(响应)的习惯。动态加载的页面或阻止Scrapy默认代理标题的网页只是简单而不仅仅是一个常规页面(仍然非常简单,总是可以解决这个问题)。

  3. _author_ = 'Tô Vạn Hưng'
    __credits__ = 'scriptso' #just helping a brother from the far east
    import scrapy
    
    class MP3Spider(scrapy.Spider):
        name = "mp3"
        start_urls = ['http://mp3.zing.vn/bai-hat/Vi-Anh-La-Soai-Ca-Dam-Vinh-Hung/ZW78EUE8.html']
    
        def parse(self, response):
            yield
            {
                'song': response.css('s.fn-name::text').extract(),
                'artist': response.css('.inline h2::text').extract_first(),
                'genre': response.xpath("//div[@class='inline']/h2/a[contains(font.font,'')]//text()").re('[^\n].*\w')[2:],
                'lyrics': response.css('.fn-wlyrics.fn-content::text').re('[^\n].*\w+'),
            }