python3抓取网易云音乐实战

  • 内容
  • 相关
准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取网易云音乐链接的爬虫。我也是刚刚入门爬虫,有什么意见和问题欢迎提出,大家一起共同进步。
闲话就不多说了~

我们的目标是:

完成网易云音乐的所有分类下的所有的播放列表,包括:播放列表的标题和url地址


思路分析:

1. 确定程序入口的位置 首先可以定位到所有的大分类和所有的小分类获取所有的小分类的地址后,

    遍历请求获取播放列表页的首页

确定程序入口的位置.png


2. 确定首页数据的位置和url地址

    数据不是在url地址对应的响应中,而是在另一个url地址中,可以使用selenium,也可以使用requests来获取

包含数据的url地址.png

3. 实现翻页和程序停止的判断

    存在下一页的情况:

网易云存在下一页的情况.png

代码分享:

# encoding: utf-8
#!/usr/bin/env python
"""
@file: xc_01_网易云音乐抓取.py
@author: www.xcooo.cn
@Mail: 602006050@qq.com
"""
import requests
from lxml import etree
from selenium import webdriver
import time
from retrying import retry

class Music163():
    def __init__(self):
        self.start_url = 'https://music.163.com/discover/playlist/'
        self.part_url = "https://music.163.com"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}
        self.session = requests.Session()
        self.driver = webdriver.Chrome()

    def parse_url(self, url):
        response = self.session.get(url, headers=self.headers)
        return response.content.decode()

    # 获取歌单大分类和小分类
    def get_category_list(self):
        resp = self.parse_url(self.start_url)
        html = etree.HTML(resp)
        dl_list = html.xpath("//div[@class='bd']/dl")
        category_list = []
        for dl in dl_list:
            a_list = dl.xpath(".//a[@class='s-fc1 ']")
            for a in a_list:
                items = {}
                items["cate_name"] = a.xpath("./text()")[0]
                items['cate_url'] = self.part_url + a.xpath("./@href")[0]
                print(items)
                category_list.append(items)

        # 获取所有小分类url
        cate_url_list = [category["cate_url"] for category in category_list]
        print(cate_url_list)
        return category_list, cate_url_list

    # 提取歌单详细信息
    @retry(stop_max_attempt_number=5)  # 尝试多次请求
    def get_playlist_list(self):
        li_list = self.driver.find_elements_by_xpath("//ul[@class='m-cvrlst f-cb']/li")
        playlist_list = []
        for li in li_list:
            items = {}
            items["music_name"] = li.find_element_by_xpath(".//a[@class='msk']").get_attribute('title')
            items["music_url"] = li.find_element_by_xpath(".//a[@class='msk']").get_attribute('href')
            items["music_author"] = li.find_element_by_xpath(".//a[@class='nm nm-icn f-thide s-fc3']").get_attribute('title')
            items["music_num"] = li.find_element_by_xpath(".//span[@class='nb']").text
            print(items)
            playlist_list.append(items)

        # 获取下一页数据
        next_url = self.driver.find_elements_by_xpath("../a[@class='zbtn znxt']")
        next_url = next_url[0] if len(next_url)>0 else None

        return playlist_list, next_url

    # 保存数据
    def save_playlist_list(self,playlist_list):
        for playlist in playlist_list:
            with open("music.txt", 'a', encoding="utf-8") as f:
                f.write("歌名: " + playlist['music_name'] + " ")
                f.write('\t')
                f.write("作者: " + playlist['music_author'] + " ")
                f.write('\t')
                f.write("播放量: " + playlist['music_num'] + " ")
                f.write('\t')
                f.write("歌曲地址: " + playlist['music_url'] + " ")
                f.write('\t')
                f.write('\n')

    def run(self):
        # 获取小分类url列表
        category_list, cate_url_list = self.get_category_list()

        # 遍历请求每个小分类 url,取到分类中的歌单名称与 url
        for cate_url in cate_url_list:
            # 请求每个分类 url
            self.driver.get(cate_url)

            # 切换到 iframe 框架中
            self.driver.switch_to.frame('g_iframe')

            # 设置等待时间
            time.sleep(5)

            # 取到数据
            print("*" * 100)
            # 输出当前 url
            print(self.driver.current_url)

            # 取到第一页的歌单数据
            playlist_list,next_url = self.get_playlist_list()

            # 保存数据
            self.save_playlist_list(playlist_list)

            # 请求下一页
            while next_url is not None:
                next_url.click()  # 页面没有完全加载完,会报错
                time.sleep(3)
                # 提取数据
                playlist_list, next_url = self.get_playlist_list()
                # 保存数据
                self.save_playlist_list(playlist_list)
            print("*" * 100)

        self.driver.quit()


if __name__ == '__main__':
    music = Music163()
    music.run()
您阅读这篇文章共花了:  

本文标签:

版权声明:转载请带上版权原创为《星城

解压密码:若设有密码均为:www.xcooo.cn

收录状态:百度已收录点击查看详情

python3抓取网易云音乐实战

发表评论

您可以选择匿名评论,保护个人隐私 !