这篇文章主要给大家介绍了关于Python3实战之爬虫抓取网易云音乐热评的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

之前刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了。于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取网易云音乐热歌榜里的热评的爬虫。我也是刚刚入门爬虫,有什么意见和问题欢迎提出,大家一起共同进步。

废话就不多说了~下面来一起看看详细的介绍吧。

我们的目标是爬取网易云中的热歌排行榜中所有歌曲的热门评论。

这样既可以减少我们需要爬取的工作量,又可以保存到高质量的评论。

实现分析

首先,我们打开网易云网页版,如图:

点击排行榜,然后点击左侧云音乐热歌榜,如图:

我们先随便打开一个歌曲,找到如何抓取指定的歌曲的热门歌评的方法,如图,我选了一个最近我比较喜欢的歌曲为例:

进去后我们会看到歌评就在这个页面的下面,接下来我们就要想办法获取这些评论。

接下来打开web控制台(chrom的话打开开发者工具,如果是其他浏览器应该也是类似),chrom下按F12,如图:

选则Network,然后我们按F5刷新一下,刷新之后得到的数据如下图所示:

可以看到浏览器发送了非常多的信息,那么哪一个才是我们想要的呢?这里我们可以通过状态码做一个初步的判断,status code(状态码)标志了服务器请求的状态,这里状态码为200即表示请求正常,而304则表示不正常(状态码种类非常多,如果要想详细了解可以自行搜索,这里不说304具体的含义了)。所以我们一般只用看状态码为200的请求就可以了,还有就是,我们可以通过右边栏的预览来粗略观察服务器返回了什么信息(或者查看响应)。通过这两种方法结合一般我们就可以快速找到我们想要分析的请求。通过反复的查找,终于找到了含有歌评的请求,如图:

可能截图在CSDN上不是很清楚,我们在一个Name为R_SO_4_489998494?csrf_token=的POST请求中找到了包含这首歌的歌评。我们把这个分块截图发出来,这样可以看的清楚一些:

请求基本信息:

请求头部:

请求中的表单数据:

我们可以看到,包含这首歌歌评的请求url为http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= ,我们换了几首歌后发现,这个请求的前部分都是一样的,只是R_SO_4_后面紧跟的一串数字不一样。我们可以推测出,每一首歌都有一个指定的id,R_SO_4_后面紧跟的就是这首歌的id。

我们再看一下提交的表单数据,我们会发现表单中需要填两个数据,名称为params和encSecKey。后面紧跟的是一大串字符,换几首歌会发现,每首歌的params和encSecKey都是不一样的,因此,这两个数据可能经过一个特定的算法进行加密过的。

服务器返回的和评论相关的数据为json格式的,里面含有非常丰富的信息(比如有关评论者的信息,评论日期,点赞数,评论内容等等),其中hotComments就是我们要找的热门评论,总共15条,如图所示:

至此,我们已经确定了方向了,即只需要确定params和encSecKey这两个参数值即可。但是这两个参数是经过特定的算法进行加密的,怎么办呢?我发现了一个规律,http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= 中 R_SO_4_后面的数字就是这首歌的id值,而对于不同的歌曲的param和encSecKey值,如果把一首歌比如A的这两个参数值传给B这首歌,那么对于相同的页数,这种参数是通用的,即A的第一页的两个参数值传给其他任何一首歌的两个参数,都可以获得相应歌曲的第一页的评论,对于第二页,第三页等也是类似。

而我们其实只需要获取第一页的15条热门评论,所以我们只需要随便找一首歌,将这首歌第一页中的该请求中的params和encSecKey这两个参数值复制下来,就可以使用了。

关于这两个参数如何解密,强大的知乎上其实已经有答案的了,感兴趣的朋友可以进去看一下(https://www.zhihu.com/question/36081767),我们在这里就只需要用我们这种偷懒的办法就可以完成需求了,xixi。

到此为止,我们如何抓取网易云音乐的热门评论已经分析完了,我们再分析一下如何获取云音乐热歌榜中所有歌曲的信息。

我们需要获取云音乐热歌榜中的所有歌曲的歌曲名和对应的id值。

跟上面的分析步骤类似,我们先进入热歌榜的网址,如图:

按F12,进入WEB工作台,如图:

我们在一个名为toplist?id=3778678的GET请求中,找到了该榜单的所有歌曲信息。

请求对应的信息如图:

我们预览一下该请求返回的结果,如图:

我们在代码的第524行我们找到了包含歌曲信息的代码,如图:

因此,我们只需要将该请求的代码中,将包含信息的代码筛选出来。

我们在这里使用正则表达式进行数据筛选。

通过观察特点,我们可以通过两次正则表达式的筛选,将我们需要的歌曲信息提取出来。

第一次正则表达式我们将该请求返回的所有代码中,提取出第525行代码。

第一次正则表达式如下:

.*

第二次正则表达式我们将该第524行中我们需要的歌曲信息提取出来,我们需要歌曲的歌名和id,对应的正则表达式如下:

获取歌名:

(.*?)

获取歌曲的id:

.*?

到此,我们整个过程已经分析完了,上代码看具体细节~~

代码如下:

#!/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'

  • .*

' #进行第一次筛选的正则表达式

result=re.compile(pat1).findall(html) #用正则表达式进行筛选

result=result[0] #获取tuple的第一个元素

pat2=r'

(.*?)' #进行歌名筛选的正则表达式

pat3=r'

.*?' #进行歌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

码运行结果如下:

对比一下网页上《如果我爱你》这首歌的歌评和我们保存下的歌评:

信息无误~

总结

以上就是Python3实现爬虫抓取网易云音乐的热门评论分析(图)的详细内容,更多请关注php中文网其它相关文章!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

python爬虫网易云音乐最热评论并分析_Python3实现爬虫抓取网易云音乐的热门评论分析(图)...相关推荐

  1. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...

    前言 之前刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了.于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取 ...

  2. Python3爬虫抓取网易云音乐热评实战

    前一段时间刚刚入门python爬虫,有大概半个月时间没有写python了,都快遗忘了.于是准备写个简单的爬虫练练手,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论,于是写了这个抓取 ...

  3. 带你写爬虫(python)第二篇----抓取网易云音乐下面的评论(API方式)

    抓取网易云音乐<大学无疆>的评论 一直喜欢使用网易云音乐,网易云歌曲下面的评论给其加分不少,所以这一篇来写一下怎么抓取歌曲下面的评论. 准备工作 目标网页:http://music.163 ...

  4. Python抓取网易云音乐热搜榜热评

    引子 啊~最有个小姐姐要做微信公众号,她需要优质的句子.文章,于是我想到了网易云每首伤感歌曲下面的评论,嗯~很感人,甚至有的时候真的感觉这里就是能触及我心灵最柔软的地方,正好这几天在学习python, ...

  5. python音乐的数据抓取与分析_python抓取网易云音乐热评做词图数据分析

    最近就有一部"怀旧"题材的电影,未播先火,那就是刘若英的处女作--<后来的我们>.青春,爱情,梦想,一直是"怀旧"题材的核心要素,虽然电影现在还未上 ...

  6. python3爬取网易云歌单数据清洗_网页抓取网易云音乐及评论数据分析

    网页抓取网易云音乐及评论数据分析 游贤 成都理工大学信息科学与技术学院 [摘 要] 摘要:为了分析网易云音乐中哪些歌曲是热门歌曲,哪些歌曲的评论 最多,从而了解到人们对于不同音乐类型的喜爱程度,采用成 ...

  7. python爬歌词_python爬虫抓取某易云音乐歌词,从此不在下载

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:企鹅号小编 ( 想要学习Python?Python学习 ...

  8. 使用selenium抓取网易云音乐数据

    今天通过一个简单的网易云音乐排行榜数据抓取与音乐下载实战案例,带着大家一起来学习如何抓取动态生成的页面内容.网易云音乐排行榜网址:https://music.163.com/#/discover/to ...

  9. python3之Scrapy+Selenium切换iframe抓取网易云音乐排行榜

    Scrapy+Selenium切换iframe抓取网易云音乐排行榜 iframe标签 Selenium (WEB自动化工具) Scrapy 框架 iframe标签 了解一下iframe 百度百科介绍的 ...

最新文章

  1. 对标Oculus Quest2,爱奇艺奇遇VR打的什么牌?
  2. C# 动态调用WebService
  3. 首尾连接的数组的求和问题
  4. Android 图片黑白显示 自定义饱和度
  5. retrofit 解析百度地图api 返回数据_阿里二面:关于 Retrofit 你知道多少?看完你的offer稳了
  6. Scala入门到精通——第十一节 Trait进阶
  7. 2016中国国际大数据大会预热活动启航,首场沙龙聚焦精准营销
  8. [Unity][FlowCanvas] FlowScript 实现基础人物移动
  9. OpenGL学习笔记:画点、直线和多边形(第一讲)
  10. ios微信下vue项目组件切换并自动播放音频的解决方案
  11. OWASP 创始人:关注首要问题,开源库也可以放心使用
  12. 二叉树层序遍历算法实现
  13. 团队作业9——项目验收与总结
  14. CST Studio Suite 2020 安装教程
  15. Unity 2D人物移动实现
  16. 点赋科技:网店的营销策略是什么?
  17. Python爬虫——爬取壁纸
  18. 什么是寄存器(Register)?收藏
  19. Opencores上的i2c controller core代码解析
  20. #基于VR环境下的手指识别键盘输入# VR场景搭建和移动漫游(一)

热门文章

  1. PHP数组学习(一)
  2. fasterrcnn论文_【论文解读】Yolo三部曲解读——Yolov1
  3. java取得泛型,Java取得泛型类型
  4. github上成员贡献量_Bifrost 长期贡献规则,获得 BNC 的 5 种方式
  5. 同时生成 Release版和Debug版DLL的方法
  6. TensorFlow:卷积神经网络
  7. Halcon 学习总结——仿射变换
  8. Visual Paradigm 教程[UML]:如何在UML中绘制活动图?
  9. JAVA_返回一个数值的相反数的几种方式.
  10. 互联网金融又任性撒钱了