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基于回溯法子集树模板解决选排问题示例
Sep 07 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
对numpy中向量式三目运算符详解
Oct 31 Python
python实现nao机器人手臂动作控制
Apr 29 Python
Django 框架模型操作入门教程
Nov 05 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
详解python tkinter 图片插入问题
Sep 03 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
java字符串格式化输出实例讲解
Jan 06 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
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
简单的Jquery全选功能
2013/11/07 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
Python读写zip压缩文件的方法
2018/08/29 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
《听鱼说话》教学反思
2014/02/15 职场文书
移交协议书
2014/08/19 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
2014年居委会工作总结
2014/12/09 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
Redis 哨兵机制及配置实现
2022/03/25 Redis
浅谈Python中对象是如何被调用的
2022/04/06 Python
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js