本文参考Monkey_D_Newdun 的文章

https://blog.csdn.net/Monkey_D_Newdun/article/details/79318629

用爬虫获取网易云音乐热门歌手评论数

运行平台:Windows 10

IDE:spyder

Python版本:3.6

浏览器:360

一、爬虫基本思路

a. 通过URL或者文件获取网页:打开网页-F12-找到需要获取的url,request header以及form data或parameters.

b. 分析要爬取的目标内容所在的位置

c. 用元素选择器快速提取(Raw) 目标内容

d. 处理提取出来的目标内容 ( 通常整理合成一个 Json)

e. 存储处理好的目标内容 (比如放到 MongoDB 之类的数据库,或者写进文件里。)

二、用到的包或模块

1.Urllib-request、requests负责连接网站,处理HTTP协议,返回网页。

2.bs4负责解析网页,将网页变成结构化数据,方便爬取

3.BeautifulSoup不用编写正则表达式也能方便的实现网页信息的抓取

4.re(正则表达式):爬取bs4也难以爬取的内容

5.json :解析器,结构化网页源代码

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


step 1 获取歌曲评论数,以周杰伦《等你下课》为例

对链接解析没有用到beautiful soup是因为网易对评论数据采取的是异步传输,不能直接通过解析网页内容得到评论数据。

F12打开开发者工具,发现评论数据在一个名为"R_SO_4_531051217?csrf_token="的post请求中。

def comment_count(song_id):  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"}#agent就是请求的身份,如果没有写入请求身份,那么服务器不一定会响应url="http://music.163.com/weapi/v1/resource/comments/R_SO_4_"+song_id+"?csrf_token="  data = {  "params": "nHfVBsNbW+WCrz7pAbdaq4uW2+4kADa+gNEfGWK7M5n36mWvsmGXsM2KzVUAeR62mhYlsSvc23I58Rf0dvg1Cglxuf5/l1wVRBCRROpjz9WuYSlWdiwXT/x45iud30RmjbTUsMSQuiehO6Ef3vHSdKWHma9pYm/eeYUF7IQ0hXI3HIz42NgwllBj4cy1XlOH",  "encSecKey": "0587c5b45f3b0771db2b3fe449e7dd9640ab56f679d73a9189096283e776e7a9f749630c6e0fa3f947778f1588b9ec71bd779279006f352e5804036909d5d772c9572c64db575bcce675fcc9055614f1c955abb798eed602cb43945748d8b0a9ecf293cde0ef523e63c3115a1a12b7113be447fba7947090f0d98d2c37cff72a"}  req=requests.post(url=url,headers=headers,data=data)  req.encoding="utf-8"  #utf-8编码,UTF-8是一种针对Unicode的可变长度字符编码,又称万国码。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。comment= json.loads(req.text)   #用于解码 JSON 数据,返回结构化Python字段的数据类型return comment["total"]  if __name__=="__main__":  print(comment_count("531051217"))

step 2 获得歌手名字与歌手ID

def artist_id():  a_headers = {"Referer": "http://music.163.com/discover/artist"  }#对付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应,所以我们还可以在headers中加入refererurl="http://music.163.com/weapi/artist/top?csrf_token="    #在开发者选项找到热门歌手对应的url,请求方式为postdata={"params":"uAE0hN7yRCy+plWTUJw7imQQW+wUSFRuVlFD8UTgXNfJTVLzNyqfnLRqSByCjs40san8rbwMfpasdpJRNit6vKkbQE0F7MZEgRPgSEVfXrHIB/wGiyYQ/VIaZnyTql1m",  "encSecKey":"def9762a8c6ff1f3ae1a7ee23cbc095b3dd6c888f28e974ca00f927fd044a48cfdde49af3138aa99fa7da17fdb97809c7d1abd4ddfc40ab7ef3c0e574e56b2d623c0c23af4d08c629087fd5e1996c961af133140dc81b9fb2322aca668a8079c6cd01a0699fc860b2bb0df47b3887d563f1b18e6585198bb5d9c718a5fa92f04"}  #用Requests和urlopen解析歌手页面的POST  req=requests.post(url=url,headers=a_headers,data=data)  #利用Request将headers,dict,data整合成一个对象传入urlopen#Request存在的意义是便于在请求的时候传入一些信息,而urlopen则不req.encoding="utf-8"   #解析所返回的JSON数据  a_data=json.loads(req.text)  #字典,含code,more,artist,其中artist是列表,含歌手名字与IDa_list=a_data["artists"]#刚刚观察返回数据可以知道歌手的信息储存在artists键中  id_list=[]#用一个列表储存所有歌手的id和name  for i in range(len(a_list)):  a_dict = {}#用一个字典储存一个歌手的id和name  a_dict["name"]=a_list[i]["name"]  a_dict["id"]=a_list[i]["id"]  id_list.append(a_dict)  return id_list  if __name__=="__main__":  print(artist_id())  

输出为一个包含60个字典的列表:

[{'name': '周杰伦', 'id': 6452}, {'name': '陈奕迅', 'id': 2116}, {'name': '薛之谦', 'id': 5781}, {'name': 'BIGBANG', 'id': 126339}, {'name': '林俊杰', 'id': 3684}, {'name': 'Maroon 5', 'id': 96266}, {'name': '王菲', 'id': 9621}, {'name': '李荣浩', 'id': 4292}, {'name': 'G.E.M.邓紫棋', 'id': 7763}, {'name': '张学友', 'id': 6460}, {'name': '杨宗纬', 'id': 6066}, {'name': '许巍', 'id': 5770}, {'name': '蔡健雅', 'id': 7214}, {'name': 'Adele', 'id': 46487}, {'name': 'Bruno Mars', 'id': 178059}, {'name': 'Coldplay', 'id': 89365}, {'name': 'Justin Bieber', 'id': 35531}, {'name': '陈粒', 'id': 1007170}, {'name': '孙燕姿', 'id': 9272}, {'name': '赵雷', 'id': 6731}, {'name': '李志', 'id': 3681}, {'name': '王力宏', 'id': 5346}, {'name': '好妹妹乐队', 'id': 711683}, {'name': 'EXO', 'id': 759509}, {'name': 'Beyond', 'id': 11127}, {'name': 'Alan Walker', 'id': 1045123}, {'name': 'Fall Out Boy', 'id': 56782}, {'name': '金玟岐', 'id': 893259}, {'name': '宋冬野', 'id': 5073}, {'name': '朴树', 'id': 4721}, {'name': 'Eminem', 'id': 32665}, {'name': '李健', 'id': 3695}, {'name': 'OneRepublic', 'id': 98105}, {'name': 'Tobu', 'id': 964486}, {'name': 'Two Steps From Hell', 'id': 102714}, {'name': '陈小春', 'id': 2112}, {'name': '那英', 'id': 9061}, {'name': '莫文蔚', 'id': 8926}, {'name': '许嵩', 'id': 5771}, {'name': '苏打绿', 'id': 12707}, {'name': 'Ed Sheeran', 'id': 33184}, {'name': '谢安琪', 'id': 9952}, {'name': '杨千嬅', 'id': 10204}, {'name': '马頔', 'id': 4592}, {'name': '张国荣', 'id': 6457}, {'name': 'Charlie Puth', 'id': 90331}, {'name': '萧敬腾', 'id': 5768}, {'name': '张敬轩', 'id': 6462}, {'name': 'Wiz Khalifa', 'id': 46006}, {'name': 'Rihanna', 'id': 72724}, {'name': '张靓颖', 'id': 10561}, {'name': 'Ellie Goulding', 'id': 56598}, {'name': '张惠妹', 'id': 10559}, {'name': 'IU', 'id': 160947}, {'name': '防弹少年团', 'id': 783124}, {'name': '澤野弘之', 'id': 15290}, {'name': 'Carly Rae Jepsen', 'id': 50934}, {'name': 'G-Dragon', 'id': 123577}, {'name': '古巨基', 'id': 2849}, {'name': '五月天', 'id': 13193}]

step 3获取歌手热门单曲ID

def song_id(artist_id):  data={"id":artist_id}#将歌手ID作为params参数传入requests.get()方法 s_url="http://music.163.com/artist"  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"}  req=requests.get(url=s_url,headers=headers,params=data)   #请求方式为get。在get请求中,允许使用params关键字,以一个字典来传递这些参数req.encoding="utf-8"  soup=BeautifulSoup(req.text,"lxml")#对返回的数据进行解析,lxml解析器,速度快,健壮性好song_list=soup.find_all("ul",class_="f-hide")#找到class="f-hide"的<ul>标签  song_soup=BeautifulSoup(str(song_list),"lxml")#将<ul>......</ul>再解析一次,以便使用find_all()方法把所有<a>标签取出来  song_list=song_soup.find_all("a")  id_list=[]#存歌曲ID  name_list=[]#存歌名  for each in song_list:  s_id=each.get("href")#歌曲ID在<a>标签href属性中  s_name=each.string  s=re.findall(r"\d+",s_id)#用正则找到href中的ID  id_list.append(s[0])#由于re.findall()返回的是一个列表,所以用下标将ID取出  name_list.append(s_name)  return id_list,name_list  if __name__=="__main__":  song_id_list,name_list=song_id(6452)    #以周杰伦为例print(song_id_list)  print(name_list)  

在get请求中,允许使用params关键字,以一个字典来传递这些参数,例如:

content={‘pageIndex‘:1,‘pageSize‘:10,‘categoryId‘:None}
r=requests.get(‘http://www.xxxxx.com/api/v2/activities‘ ,params=content)
print (r.url)

#结果

http://www.xxxx.com/api/v2/activities?pageIndex=1&pageSize=10

正则 re.findall 的简单用法

(返回string中所有与pattern相匹配的全部字串,返回形式为数组) 语法: findall(pattern, string, flags=0)

“d”是正则语法规则用来匹配0到9之间的数返回列表

import re
re.findall(r"\d\d\d","https://docs.python.org/3/whatsnew/3.6.html/1234")

输出:

['123']
import re
re.findall(r"\d\d","https://docs.python.org/3/whatsnew/3.6.html/1234")

输出:

['12', '34']

import re
re.findall(r"\d+","https://docs.python.org/3/whatsnew/3.6.html/1234")

输出:

['3', '3', '6', '1234']

step 4 获取歌手&总评论

if __name__=="__main__":  f=open("网易云评论.txt","w",encoding="utf-8")   #用写的方式打开网易云评论.txt这个文件id_list=artist_id()  for artist in id_list:  total=0  f.write("\n\n"+artist["name"]+"热门歌曲以及评论数:")  #写入文件网易云评论.txt:XXX(歌手名)热门歌曲以及评论数:song_id_list,name_list=song_id(artist["id"])   #两个列表,歌曲id&歌曲名for i in range(len(song_id_list)):  if(name_list[i]!=None):  #歌手澤野弘之有些歌曲名字为nulltotal+=comment_count(song_id_list[i])  f.write(name_list[i]+":"+str(comment_count(song_id_list[i]))+"条")  f.write("总计:"+str(total)+"条")  print(artist["name"]+"网易云音乐热门歌曲总评论数:"+str(total)+"条")  print("抓取完毕!")  

输出:

周杰伦网易云音乐热门歌曲总评论数:710456条
陈奕迅网易云音乐热门歌曲总评论数:1340896条
薛之谦网易云音乐热门歌曲总评论数:3876733条
BIGBANG网易云音乐热门歌曲总评论数:72278条
林俊杰网易云音乐热门歌曲总评论数:1047567条
Maroon 5网易云音乐热门歌曲总评论数:376437条
王菲网易云音乐热门歌曲总评论数:676064条
李荣浩网易云音乐热门歌曲总评论数:669950条
G.E.M.邓紫棋网易云音乐热门歌曲总评论数:479356条
张学友网易云音乐热门歌曲总评论数:484701条
杨宗纬网易云音乐热门歌曲总评论数:566335条
许巍网易云音乐热门歌曲总评论数:417892条
蔡健雅网易云音乐热门歌曲总评论数:486667条
Adele网易云音乐热门歌曲总评论数:276238条
Bruno Mars网易云音乐热门歌曲总评论数:421597条
Coldplay网易云音乐热门歌曲总评论数:725671条
Justin Bieber网易云音乐热门歌曲总评论数:726028条
陈粒网易云音乐热门歌曲总评论数:845892条
孙燕姿网易云音乐热门歌曲总评论数:769744条
赵雷网易云音乐热门歌曲总评论数:1398742条
李志网易云音乐热门歌曲总评论数:773379条
王力宏网易云音乐热门歌曲总评论数:559485条
好妹妹乐队网易云音乐热门歌曲总评论数:565989条
EXO网易云音乐热门歌曲总评论数:113269条
Beyond网易云音乐热门歌曲总评论数:327790条
Alan Walker网易云音乐热门歌曲总评论数:1346941条
Fall Out Boy网易云音乐热门歌曲总评论数:261950条
金玟岐网易云音乐热门歌曲总评论数:681762条
宋冬野网易云音乐热门歌曲总评论数:771306条
朴树网易云音乐热门歌曲总评论数:536437条
Eminem网易云音乐热门歌曲总评论数:398636条
李健网易云音乐热门歌曲总评论数:236075条
OneRepublic网易云音乐热门歌曲总评论数:294360条
Tobu网易云音乐热门歌曲总评论数:435382条
Two Steps From Hell网易云音乐热门歌曲总评论数:643321条
陈小春网易云音乐热门歌曲总评论数:311270条
那英网易云音乐热门歌曲总评论数:177621条
莫文蔚网易云音乐热门歌曲总评论数:402836条
许嵩网易云音乐热门歌曲总评论数:3386821条
苏打绿网易云音乐热门歌曲总评论数:299000条
Ed Sheeran网易云音乐热门歌曲总评论数:431641条
谢安琪网易云音乐热门歌曲总评论数:264638条
杨千嬅网易云音乐热门歌曲总评论数:289710条
马頔网易云音乐热门歌曲总评论数:318597条
张国荣网易云音乐热门歌曲总评论数:504605条
Charlie Puth网易云音乐热门歌曲总评论数:676351条
萧敬腾网易云音乐热门歌曲总评论数:245439条
张敬轩网易云音乐热门歌曲总评论数:296725条
Wiz Khalifa网易云音乐热门歌曲总评论数:282971条
Rihanna网易云音乐热门歌曲总评论数:309311条
张靓颖网易云音乐热门歌曲总评论数:288221条
Ellie Goulding网易云音乐热门歌曲总评论数:166458条
张惠妹网易云音乐热门歌曲总评论数:264970条
IU网易云音乐热门歌曲总评论数:39468条
防弹少年团网易云音乐热门歌曲总评论数:96838条
澤野弘之网易云音乐热门歌曲总评论数:123395条
Carly Rae Jepsen网易云音乐热门歌曲总评论数:172148条
G-Dragon网易云音乐热门歌曲总评论数:64666条
古巨基网易云音乐热门歌曲总评论数:151144条
五月天网易云音乐热门歌曲总评论数:122676条
抓取完毕!
2018/4/23 00点11分

爬虫入门——用python爬取网易云音乐热门歌手评论数相关推荐

  1. Python爬取网易云音乐所有歌手的名称和链接

    一.需求 Python爬取网易云音乐所有歌手的名称和链接 二.代码实现 import requests from lxml import etree from urllib import reques ...

  2. 如何用 Python 爬取网易云音乐的 10w+ 评论?附详细代码解读

    在简单学习了Python爬虫之后,我的下一个目标就是网易云音乐.因为本人平时就是用它听的歌,也喜欢看歌里的评论,所以本文就来爬一爬网易云音乐的评论吧! 正式进入主题 首先是找到目标网页并分析网页结构, ...

  3. 用python爬取网易云评论最多的歌_巧用Python爬取网易云音乐歌曲全部评论

    一.首先分析数据的请求方式 网易云音乐歌曲页面的URL形式为https://music.163.com/#/song?id=歌曲id号,这里我用Delacey的Dream it possible 为例 ...

  4. 用爬虫获取网易云音乐热门歌手评论数

    转载请注明作者和出处:http://blog.csdn.net/Monkey_D_Newdun 运行平台:Windows 10 IDE:Pycharm Python版本:3.6.0 浏览器:Chrom ...

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

    Python爬取网易云音乐热歌榜歌曲,并下载到本地 找到要下载歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更 ...

  6. [爬虫]Python爬取网易云音乐搜索并下载歌曲!

    Python爬取网易云音乐搜索并下载歌曲! 文章目录 Python爬取网易云音乐搜索并下载歌曲! 1.准备工作 2."实地"观察 3.开始码代码! 4.搜索并下载 结束语 1.准备 ...

  7. Python爬取网易云音乐歌手歌曲和歌单(爬虫)

    Python爬取网易云音乐歌手歌曲和歌单 是 仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 ①找到要下载歌手歌曲的链接,这里用的是: https://music.16 ...

  8. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  9. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

最新文章

  1. Java学习总结:2
  2. 网管师、网管员和网络工程师的区别(2)
  3. slplunk原始数据和索引数据大小比较
  4. linux 下添加,修改,删除路由
  5. svnsync实现版本库的同步备份
  6. 重启模块与及关开邮件存储设置功能页面-PHP-shell-py
  7. ASP.NET AJAX - Timer控件之摆放位置的影响
  8. css黑色字白色描边,css怎么设置字体白色描边
  9. IDEA项目中 target 目录的作用
  10. Linux系统编程:习题,父子进程通过信号通信,实现交替数数
  11. 关于注册规划师的点点碎碎
  12. Oracle数据库学习(四)
  13. 2019腾讯广告算法大赛完美收官,算法达人鹅厂“出道”
  14. 将linux用在开发环境中
  15. 使用PR剪辑视频,mkv格式怎么无损转mp4
  16. 线性代数 n维向量思维导图总结(看这一张就完事了)
  17. 打印excel html js,前端js打印(导出)excel表格的方法实例
  18. 攻防世界——web新手题
  19. c语言时钟加秒表报告,51单片机秒表计时器课程设计报告(含C语言程序)-20210419061005.docx-原创力文档...
  20. Linux内核IP Queue机制的分析(一)

热门文章

  1. 计算机程序设计c++ 7-2:函数与指针
  2. 【Lesson1】「ALOS数据」SAR土地利用分类41
  3. 关闭应用程序遥测,禁止Windows收集用户信息
  4. 录屏软件哪个好?分享:好用的录屏软件,一款就够!
  5. 日报周报月报工作总结生成器「智能文案生成器」
  6. 邮件服务器之SMTP协议分析
  7. 【web++_网站发布、新浪云、招生、支付、搜索】
  8. 直播视频app源码,高度不能充满全屏
  9. 撩课python视频下载_撩课-Python-GUI编程-PyQT5代码 要毕业查重了给我来这套 - 下载 - 搜珍网...
  10. 新手使用腾讯云服务器通过FTP传输文件基本事项