python爬取网易云音乐热歌榜实例代码


Posted in Python onAugust 07, 2020

首先找到要下载的歌曲排行榜的链接,这里用的是:

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("下载完毕")

内容扩展:

Python3实战之爬虫抓取网易云音乐的热门评论

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import urllib.request
import urllib.error
import urllib.parse
import json



def get_all_hotSong(): #获取热歌榜所有歌曲名称和id
 url='http://music.163.com/discover/toplist?id=3778678' #网易云云音乐热歌榜url
 html=urllib.request.urlopen(url).read().decode('utf8') #打开url
 html=str(html) #转换成str
 pat1=r'<ul class="f-hide"><li><a href="/song\?id=\d*?" rel="external nofollow" rel="external nofollow" >.*</a></li></ul>' #进行第一次筛选的正则表达式
 result=re.compile(pat1).findall(html) #用正则表达式进行筛选
 result=result[0] #获取tuple的第一个元素

 pat2=r'<li><a href="/song\?id=\d*?" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>' #进行歌名筛选的正则表达式
 pat3=r'<li><a href="/song\?id=(\d*?)" rel="external nofollow" >.*?</a></li>' #进行歌ID筛选的正则表达式
 hot_song_name=re.compile(pat2).findall(result) #获取所有热门歌曲名称
 hot_song_id=re.compile(pat3).findall(result) #获取所有热门歌曲对应的Id

 return hot_song_name,hot_song_id

def get_hotComments(hot_song_name,hot_song_id):
 url='http://music.163.com/weapi/v1/resource/comments/R_SO_4_' + hot_song_id + '?csrf_token=' #歌评url
 header={ #请求头部
 'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
 #post请求表单数据
 data={'params':'zC7fzWBKxxsm6TZ3PiRjd056g9iGHtbtc8vjTpBXshKIboaPnUyAXKze+KNi9QiEz/IieyRnZfNztp7yvTFyBXOlVQP/JdYNZw2+GRQDg7grOR2ZjroqoOU2z0TNhy+qDHKSV8ZXOnxUF93w3DA51ADDQHB0IngL+v6N8KthdVZeZBe0d3EsUFS8ZJltNRUJ','encSecKey':'4801507e42c326dfc6b50539395a4fe417594f7cf122cf3d061d1447372ba3aa804541a8ae3b3811c081eb0f2b71827850af59af411a10a1795f7a16a5189d163bc9f67b3d1907f5e6fac652f7ef66e5a1f12d6949be851fcf4f39a0c2379580a040dc53b306d5c807bf313cc0e8f39bf7d35de691c497cda1d436b808549acc'}
 postdata=urllib.parse.urlencode(data).encode('utf8') #进行编码
 request=urllib.request.Request(url,headers=header,data=postdata)
 reponse=urllib.request.urlopen(request).read().decode('utf8')
 json_dict=json.loads(reponse) #获取json
 hot_commit=json_dict['hotComments'] #获取json中的热门评论


 num=0
 fhandle=open('./song_comments','a') #写入文件
 fhandle.write(hot_song_name+':'+'\n')

 for item in hot_commit:
 num+=1
 fhandle.write(str(num)+'.'+item['content']+'\n')
 fhandle.write('\n==============================================\n\n')
 fhandle.close()




hot_song_name,hot_song_id=get_all_hotSong() #获取热歌榜所有歌曲名称和id

num=0
while num < len(hot_song_name): #保存所有热歌榜中的热评
 print('正在抓取第%d首歌曲热评...'%(num+1))
 get_hotComments(hot_song_name[num],hot_song_id[num])
 print('第%d首歌曲热评抓取成功'%(num+1))
 num+=1

以上就是python爬取网易云音乐热歌榜实例代码的详细内容,更多关于python爬取网易云音乐热歌榜的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Python中使用SQLite的简单教程
Apr 29 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
在python中bool函数的取值方法
Nov 01 Python
python 实现UTC时间加减的方法
Dec 31 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
Django中URL的参数传递的实现
Aug 04 Python
python中栈的原理及实现方法示例
Nov 27 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 Python
Python变量格式化输出实现原理解析
Aug 06 #Python
Python实现Canny及Hough算法代码实例解析
Aug 06 #Python
vscode调试django项目的方法
Aug 06 #Python
Python如何使用input函数获取输入
Aug 06 #Python
Python map及filter函数使用方法解析
Aug 06 #Python
python学习笔记之多进程
Aug 06 #Python
Selenium alert 弹窗处理的示例代码
Aug 06 #Python
You might like
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
python游戏地图最短路径求解
2019/01/16 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
华为的Java面试题
2014/03/07 面试题
学院书画协会部门职责
2013/11/28 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
个性婚礼策划方案
2014/05/17 职场文书
趣味运动会广播稿
2014/09/13 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
教师党员整改措施
2014/10/24 职场文书
烟台的海导游词
2015/02/02 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
2015年教师节感言
2015/08/03 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
新手初学Java网络编程
2021/07/07 Java/Android
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript