美文网首页我爱编程
【python爬虫】Beyond歌词爬取、分析

【python爬虫】Beyond歌词爬取、分析

作者: GaGLee | 来源:发表于2018-04-13 21:47 被阅读0次

测试分析

scrawl shell http://www.lrcgc.com/lyric-263-314689.html
得到response 200,可以爬取

写爬虫

本次爬取的目标网站属于双向爬取

  • 横向:主页切换+下一次的URL。目标:yield next_url
  • 纵向:从主页进入子页,获取歌词信息。目标:yield items
    特殊说明:需要明确items,url在parse()方法中的任何位置返回都可以,而且items的多个属性还可以在parse()方法及其调用的son_parse方法中的任意位置提取、返回!本项目中共设置了4个信息字段,其中name album url三个items属性在parse()方法中提取并返回,另外一个lrc歌词属性则在处理子页面信息的son_parse方法中获取,而且parse()、son_parse方法中都需要items = BeyongLrcItem()、yield items。
  1. items.py中,定义四个属性
    name = scrapy.Field()
    album = scrapy.Field()
    url = scrapy.Field()
    lrc = scrapy.Field()
  1. spider.py中,定义parse()、son_parse()两个方法
    2.1定义parse()方法
    提示:别忘了import items,并设置Source Root
    代码核心:谨记两个任务(返回items、next_url)、返回next_url时用if分情况yield
    def parse(self, response):
        items = BeyongLrcItem()
        items["name"] = response.xpath("//div[@class='thread_posts_list']/table/tbody/tr/td[1]/a/text()").extract()
        items["album"] = response.xpath("//div[@class='thread_posts_list']/table/tbody/tr/td[2]").extract()
        items["url"] = response.xpath("//div[@class='thread_posts_list']/table/tbody/tr/td[1]/a/@href").extract()
        now_page_num = response.xpath("//div[@class='pages']/strong/text()").extract()[0]
        # 即使只有一个数字,xpath.extract()返回的是一个list,不能对list用int,必须添加[0]将这个元素取出
        yield items
        print("成功提取到第", now_page_num, "主页中所有歌曲的名称、专辑和链接3个信息")
        for i in range(len(items["url"]) + 1):
            if i < len(items["url"]):
                print("正在进入第", i + 1, "首歌曲的歌词页面")
                next_page = "http://www.lrcgc.com/" + items["url"][i]
                yield scrapy.Request(next_page, callback=self.son_parse)
                print("成功,将发起下一次请求……")
            else:
                offset = int(now_page_num) + 1
                print("当前页面的歌曲信息已经全部提取完成,即将进入第", offset, "个页面")
                next_page = "http://www.lrcgc.com/songlist-263-" + str(offset) + ".html"
                yield scrapy.Request(next_page, callback=self.parse)
                print('-' * 100)

错点提示:

  • 任务一,返回yield items,不是yield items["name"],items["album"],items["url"]
  • response.xpath("").extract()返回的是一个list,不能对list直接进行int()运算。因此,必须添加[0],更正为response.xpath("").extract()[0]
  • 任务二,返回url。通过if判断,进行两种不同的yield url。
    2.2定义son_parse()方法
    代码核心:只有一个任务:yield items,无需yield next_url
    def son_parse(self, response):
        items = BeyongLrcItem()
        items["lrc"] = response.xpath("//p[@id='J_lyric']/text()").extract()
        yield items

Done!

相关文章

网友评论

    本文标题:【python爬虫】Beyond歌词爬取、分析

    本文链接:https://www.haomeiwen.com/subject/aqjhkftx.html