路漫漫其修远兮,吾将上下而求索

导航

python爬取网易云飙升榜音乐

1、分析网页
找到.m4a的歌曲链接
去掉#号

2、添加UA
伪装成正常浏览器

3、使用xpath筛选数据
用zip处理大内容列表为单独

4、保存文件

开发工具-网络-媒体里找到.m4a音频

image

在XHR动态网页里找到.m4a音频真实url地址

image

官方插件下载xpath helper
image
PS:重启浏览器使用

不知道为什么不太行(但是后面python程序执行不影响)
image

xpath语法格式对应规律

image

从列表中提取数据,使用zip

image

点击查看代码
# Author:Jasy
# 爬取网易云音乐飙升榜歌曲

import requests
from lxml import etree

# https://music.163.com/song/media/outer/url?id= 外链地址

# 1、确定网址
# url里的#号是网页访问第一道,不是最终网页url,要去掉 原url https://music.163.com/#/discover/toplist?id=19723756
url = 'https://music.163.com/discover/toplist?id=19723756'
base_url = 'https://music.163.com/song/media/outer/url?id='

# 2.1添加UA  伪装成正常浏览器
ua = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}

# 2.2请求
html_str = requests.get(url,headers=ua).text

# 3、筛选数据 (使用xpath  专门用来处理xml,html数据的,字符串的需要转换,就需要使用lxml工具,bs4现在用的少)
html = etree.HTML(html_str)  # 使用lxml转换成真正的html类型
song_names = html.xpath('//a[contains(@href,"song?id=")]/text()')  #xpath语法  //表示任意位置 @表示属性 contains内容
song_ids = html.xpath('//a[contains(@href,"song?id=")]/@href')

for song_id,song_name in zip(song_ids,song_names):   #从列表中批量提取单个数据
    song_id = song_id.strip('/song?id=') #用strip剥去song_id中的'/song?id='字符串

    if '$' not in song_id:  #去掉song_id中带$开头的字符串
        song_url = base_url + song_id
        print(song_url)

        # 如果拿的是视频 音频 图片,用content
        mp3 = requests.get(song_url,headers=ua).content

# 4、保存   注意绝对路径和相对路径(用./),我这里用的绝对路径
        with open(f'E:/python爬虫练习/wangyiyun/{song_name}.mp3','wb') as f:
            f.write(mp3)

xpath语法 - 2orange - 博客园

posted on 2023-07-06 00:26  爱在西元间  阅读(401)  评论(0编辑  收藏  举报