Python实习第七天代码

网易云歌曲下载

通过前两天的学习,已经学会了Xpath命令和BeautifulSoup命令,现在大家就要找到适合自己的命令来对HTML代码进行解析
对于我本人而言,我更喜欢BeautifulSoup来解析代码

我们今天呢,老师带领我们爬取一个比较厉害的网站网易云音乐
我们首先搜索一首歌曲,然后你会看到很多条曲目:我们可以点击曲目下的歌手看看这个歌手的专辑
好的,那我们现在就实现网易云会员歌曲下载

1.下载曲目保存.mp3文件
这个网易云的链接不是那么好获取的,需要按下F12分析同时,我们要点击NetWork来进行分析,通过观察我们的链接中有一个#号,这个#号表示分割符,我们在Network中分析#前的DOC文件,再分析#后的DOC文件
每次请求网页需要不同的请求头,需要进行伪装
然后我们有一些网易云api可以用网易云api接口

这个网页分析着实是个能力,需要自己多想,这里只能指点下了
下面是今天的代码内容

'''
1。网页,查看单首歌的路径
 通过歌曲列表点击单首歌: href=/song?id=468490571
 https://music.163.com/#/song?id=468490571
 下载:
 http://music.163.com/song/media/outer/url?id=468490571.mp3
 歌词下载:

 尝试下载一首歌内容
 https://music.163.com/#/song?id=468490571
2。
'''
import random
import re
import time
from urllib import request

import requests
from bs4 import BeautifulSoup

user_agents = [
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
]


def get_resource(url, params=None, flag='html'):
    headers = {
        'referer': 'http://music.163.com/',
        'Host': 'music.163.com',
        'User-Agent': random.choice(user_agents),
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'

    }
    # 使用requests发出请求
    response = requests.get(url=url, params=params, headers=headers)
    print(response.status_code)
    # 判断response的状态码
    if response.status_code == 200:
        # 判断flag
        if flag == 'html':
            return response.text
        elif flag == 'media':
            return response.content
    else:
        print('获取资源有误!')


# 获取歌曲列表  bs4
def get_music_list(html):
    soup = BeautifulSoup(html, 'lxml')
    a_list = soup.find('ul', class_='f-hide').find_all('a')
    # 歌曲列表
    song_list = []
    for a_tag in a_list:
        song_id = a_tag.get('href').rsplit("=")[-1]
        song_name = a_tag.text
        song = [song_name, song_id]
        # 添加到列表中
        song_list.append(song)
    return song_list


# 封装: 下载音乐
def download_music(url, songname):
    headers = {
        'referer': 'http://music.163.com/',
        # 'Host': 'm10.music.126.net',
        'User-Agent': random.choice(user_agents),
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'

    }
    # 使用requests发出请求
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        resource = response.content
        if resource:
            # 本地保存
            with open('music/{}.mp3'.format(songname), 'wb') as fw:
                fw.write(resource)
                print('成功下载:{}.mp3'.format(songname))
        else:
            print('下载{}失败'.format(songname))
    else:
        print('请求资源有误!')


# 获取歌词
def get_lyric(lyric_url, songname):
    # 获取响应对象
    headers = {
        'referer': 'http://music.163.com/',
        # 'Host': 'm10.music.126.net',
        'User-Agent': random.choice(user_agents),
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'

    }
    response = requests.get(lyric_url,headers=headers)
    # 判断状态码
    if response.status_code == 200:
        json_data = response.json()
        # json_data ---->字典数据
        lrc = json_data.get('lrc')
        if lrc:  # lrc= {'key':'value'}
            lyric = lrc.get('lyric')
            # 清洗  通过正则表达式完成替换
            final_lyric = re.sub(r'\[.*\]', '', lyric)  #
            # 本地保存
            with open('musicword/{}.txt'.format(songname), 'w',encoding="utf-8") as fw:
                fw.write(final_lyric)
            print('成功保存{}歌词'.format(songname))
        else:
            print('解析失败!')

    else:
        print('歌词请求有误!')


if __name__ == '__main__':
    #
    url = 'https://music.163.com/playlist?id=3134064854'
    # 获取资源
    html = get_resource(url=url)
    # 本地保存
    with open('file/music.html', 'w',encoding="utf-8") as fw:
        fw.write(html)
    # 开始解析
    song_list = get_music_list(html)
    print(song_list)
    # http://music.163.com/song/media/outer/url?id=536622304.mp3
    for song in song_list:  # ['名字','id']
        url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song[1])
        print(url, song[0])
        # 下载音乐
        download_music(url, song[0])

        # 下载歌词
        lyric_url = 'http://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1'.format(song[1])
        get_lyric(lyric_url, song[0])

        time.sleep(random.randint(1, 5))

这个网易云要想破解的话很难,我们只需要用api去搞就好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值