Python爬取网易云音乐热歌榜(爬虫)

Python爬取网易云音乐热歌榜歌曲,并下载到本地

找到要下载歌曲排行榜的链接,这里用的是:
https://music.163.com/discover/toplist?id=3778678
然后更改你要保存的目录,目录要先建立好文件夹,例如我的是保存在D盘-360下载-网易云热歌榜文件夹内,就可以完成下载。如果文件夹没有提前建好,会报错[Errno 2] No such file or directory。

from urllib import request
from bs4 import BeautifulSoup
import re
import requests
import time


class Music(object):
    def __init__(self, baseurl, path):
        head = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
            }
        self.baseurl = baseurl
        self.headers = head
        self.path = path


    def main(self):
        html = self.askurl()
        bs4 = self.analysis(html)
        name1 = self.matching(bs4)
        self.save(name1)


    def askurl(self):
        req = request.Request(url=self.baseurl, headers=self.headers)
        response = request.urlopen(req)
        html = response.read().decode("utf-8")
        return html


    def analysis(self, html):
        soup = BeautifulSoup(html, "html.parser")
        bs4 = soup.find_all("textarea")
        bs4 = str(bs4)
        return bs4


    def matching(self, bs4):
    	rule0 = re.compile(r'"name":"(.*?)","tns":[],"alias":[]')
        name0 = re.findall(rule0, bs4)
        str = ""
        for i in name0:
            str  = str + "," + i
        str = str.replace("\xa0", " ")
        rule1 = re.compile(r'jpg,(.*?),(.*?)","id":(\d*)')
        name1 = re.findall(rule1, str)
        return name1


    def save(self, name1):
        for j in name1:
            print("正在下载:" + j[1] + " - " + j[0] + "...")
            url = "http://music.163.com/song/media/outer/url?id=" + j[2]
            content = requests.get(url=url, headers=self.headers).content
            with open(self.path + j[1] + " - " + j[0] + ".mp3", "wb") as f:
                f.write(content)
            print(j[1] + " - " + j[0] + "下载完毕。\n")
            time.sleep(0.5)
        return


if __name__ == "__main__":
    baseurl = "https://music.163.com/discover/toplist?id=3778678"  # 要爬取的热歌榜链接
    path = "D:/360下载/网易云热歌榜/"  # 保存的文件目录
    demo0 = Music(baseurl, path)
    demo0.main()
    print("下载完毕")

写于8月5号,有想法可以一起探讨。

以上内容就不修改了。

8月18修改内容,加一句
baseurl = baseurl.replace("#/", “”)
就可以用网址:https://music.163.com/#/discover/toplist?id=3778678

def __init__(self, baseurl, path):
        head = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
            }
        baseurl = baseurl.replace("#/", "")  # 8月18日添加一句
        self.baseurl = baseurl
        self.headers = head
        self.path = path
  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
好的,这是一个比较常见的爬虫案例,我可以给你提供一个基本的代码框架,但需要提醒的是,网易云音乐有反爬措施,如果你频繁地爬取数据可能会被封禁IP,所以请合理使用爬虫工具。 首先,你需要安装requests和BeautifulSoup库,可以使用pip命令进行安装。 ```python pip install requests pip install beautifulsoup4 ``` 然后,你可以使用下面的代码来爬取网易云音乐热歌评论: ```python import requests from bs4 import BeautifulSoup # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 获取歌曲ID def get_music_id(): url = 'https://music.163.com/discover/toplist?id=3778678' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') music_id = soup.select('#song-list-pre-cache ul li a')[0]['href'] return music_id.split('=')[1] # 获取评论数据 def get_comments(): music_id = get_music_id() url = f'https://music.163.com/weapi/v1/resource/comments/R_SO_4_{music_id}?csrf_token=' data = { 'params': 'v3NN7cNlbVqjU3s3VH8Q8J2ubwbi+2XQdSvLsZ9VOM2JF8C9F+uLX2zO5S0vC/KyPgOznLWc9jXj7J6zZr6fBm0qzrY+7uZPnQbrI+UWqJbIM2vO7W3JjV9Ri5Jv5sT5mUgGqHh+XyB4uh0zvGh9ZJ8yL4Yx/5RxE0KfGJjFtUwLrUqH6PQeGKvTfcTcXAAeX', 'encSecKey': '3c2a73e4d9c3f4b7f43e5d285b329f8b796e58f099a21d9e0cb8fb0f8c3b835e0f3c9e73a5b6c7c2c4a2c35a2e7d6b5d4a2c9f8f7d4d6f0a28c1d8a7e9f354d0d3bdcacf3e5a96e8f3ec6b7ba1a0d9f3d9c9f5e7ab6f9c7a3f9c1a9f95e6cbebcf0e6e7e7d1d1f6e4b9a2cb5f9e', 'encText': 'id=3778678&offset=0&total=false&limit=20&csrf_token=' } response = requests.post(url, headers=headers, data=data) comments_json = response.json() comments = [comment['content'] for comment in comments_json['comments']] return comments if __name__ == '__main__': comments = get_comments() print(comments) ``` 代码中,我们首先通过requests库发送请求,使用BeautifulSoup库解析HTML,获取网易云音乐热歌歌曲ID。然后,我们构造POST请求,向指定歌曲的评论API发送请求,获取评论数据。 最后,我们打印出获取到的评论数据。 注意,代码中的data字典中的参数是经过加密的,如果有需要可以使用Fiddler等工具进行抓包分析。另外,获取到的评论数据是JSON格式,我们可以通过json库进行解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰贩卖员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值