爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例。毛不易–水乡

一、常规方法

1. 尝试直接爬取

先直接用歌曲链接直接爬取

import requests#URL
url = 'https://music.163.com/#/song?id=1408763442'
#请求头
headers = {   "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4098.3 Safari/537.36'
}#发送请求
response = requests.get(url,headers = headers)
#解码
data = response.content.decode('utf-8')
#写入文件
with open('wangyiyun.txt','w',encoding = 'utf8') as f:f.write(data)

但是里面并没有我们想要的评论信息

2. 分析network,寻找目标文件

进入网页的“最新评论区”,我们每点击底下的“下一页”,网站的url并没有任何变化,说明整个评论区的内容都是通过Ajax异步请求技术得到的。我们右击检查进入开发者模式,在network下可以看到交互的全部数据。

现在我们的目标就是从里面找到藏有 “评论” 的文件,对于动辄几十上百个文件的网页来说,一个个找太浪费时间了,我们可以想既然是评论,那么必定是从服务器的数据库里提取的一大串文本,然后传输给咱的浏览器。所以,我们可以再过滤一下,这里可以单独查看 XHR 类型和 Doc 类型的文件。
XHR 即 XMLHttpRequest,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。
通过Ajax异步请求技术得到的数据一般是在XHR里面的,果然我们在XHR中发现评论位于 R_SO_4_1408763442?csrf_token= 这个文件中。

选中R_SO_4_1408763442?csrf_token= 这个文件,点击 “Headers” 。我们可以看到此处请求的url为https://music.163.com/weapi/v1/resource/comments/R_SO_4_1408763442?csrf_token=
并且他是个post请求,带两个参数“params” 和 “encSecKey” 。

3. 下载目标文件

使用这个链接带上参数访问,看看有没有评论数据。

import requests#URL
url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_1408763442?csrf_token='
#请求头
headers = {   "User-Agent": 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',#'referer': "https://music.163.com/song?id=1405283464"
}params = "COX3x19Pu9O4J8+jm2A6xzQjLhUcAi9x+HZpKhw1Jv3SD3wvXzZ5mzZdX0rLzVrLCIJ5g1MQI/L3waiLa018uY57/r0rg/qBjwhlZsCM8sgdNSxd8rOCzkgUHPif0E8uSCoYpI8g4FqtR8TyZCsNmEkO+nwCCEBxZlCkSKW1hpSIFV/puhZwzDJ+3nQ+tPz3"
encSecKey = "18fbf2957d5334b58c45821b34b6d1f13de9c1f144743f3d60972a7957e83ac49313f1d2b5e267c279f88a767e28d03b409f3ab6b53c779622c849c80e8c436b9cf2bca51831505083cc2ffe200a9bb0a597f077d1467c236935a9487a63bba5ac5283264de92097450f044b8cbec99a48471225d0c604fc553e38d8173f66ae"
data = {'params':params,'encSecKey':encSecKey
}#发送请求
response = requests.post(url,headers = headers,data = data)
#解码
#data = response.content.decode('utf-8')
##data = response.text
##写入文件
#with open('wangyiyun.html','w', encoding="utf-8") as f:
#    f.write(data)with open('comments.txt', 'w', encoding='utf-8') as file:file.write(response.text)

事实证明这样是行得通的。

但是我们不停点击网页评论区下一页,进行抓包,发现每一页对应的form data中params以及encSecKey字段内容都是不一样的,所以如果不能找到规律,我们就只能爬取第一页的热门评论和最新评论,做不到翻页爬取所有评论。

对以大部分人来说加密参数我们难以直接找出其规律,也很难直接分析ajax来抓取。为了解决这个问题,我们可以直接使用模拟浏览器运行的方式来实现,不用管后台的ajax接口到底有哪些参数,如何解密的。这里我们使用Selenium模拟浏览器运行。

二、使用Selenium

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

1. 准备工作

本文用Chrome浏览器来使用Selenium。在使用Selenium之前需要安装好Chrome浏览器并且配置好ChromeDriver。另外需要正确安装好Selenium库。

2. 开始爬取

首先用歌曲链接直接访问,打印出网页源代码,查找有没有评论信息。selenium支持有界面和无界面启动chrome。我们这里选择无界面启动。

from selenium import webdriver#无界面启动
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(options=chrome_options)
#有界面启动
#browser = webdriver.Chrome()
#隐式等待 3秒
browser.implicitly_wait(3)
browser.get('https://music.163.com/#/song?id=1408763442')
print(browser.page_source)

查找打印的源代码并没有评论信息,这是怎么回事呢?

3. 切换子界面

我们打开浏览器看看源代码

在源代码中我们看到我们想要的评论信息全部都在iframe子页面中。而selenium打开页面后,默认是在父级Frame里面操作。我们使用子界面的id="g_iframe"切换到子界面,再打印源代码。

from selenium import webdriver#无界面启动
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(options=chrome_options)
#有界面启动
#browser = webdriver.Chrome()
#隐式等待 3秒
browser.implicitly_wait(3)
browser.get('https://music.163.com/#/song?id=1408763442')
#切换子页面
browser.switch_to.frame('g_iframe')
print(browser.page_source)

在源代码中出现了评论信息

4. 提取首页评论信息

进入开发者页面,定位到评论信息处,可以看到评论信息都在类’cnt f-brk’内,首页一共35条包括15条热门评论和20条普通评论。

#首页
hot_message_name = []
hot_message_commet = []
message_name = []
message_commet = []
commet = browser.find_elements_by_css_selector('.cnt.f-brk')
for each in range(len(commet)):if each < 15:       #热门评论hot_message_name.append(commet[each].text.split(':')[0])hot_message_commet.append(commet[each].text.split(':')[1])else:         #全部评论message_name.append(commet[each].text.split(':')[0])message_commet.append(commet[each].text.split(':')[1])#print(commet[each].text)
#print(len(commet))

5. 提取其他页信息

(1)总页数

评论信息是一直在变动的,要爬取全部评论信息,必须知道总页数。定位到总页数,包含总页数的类名后面的数字是时间戳加3位随机数字,是一个变化的类名,如果用完整的类名定位太麻烦了,我们也并不清楚随机数是如何生成的,但是我们如果只用类名前面部分定位,也是可以的,并且它是唯一的。

#总页数
pagecount_button = browser.find_element_by_css_selector('a[class^="zpgi zpg9 "]')
pagecount = int(pagecount_button.text)
print(pagecount_button.text)

(2)下一页

在知道总页数的基础上,我们就知道使用selnium模拟浏览器点击“下一页”的次数。
定位下一页,搜索“下一页”文字是唯一的,所以可以直接使用‘下一页’定位。

# 下一页
#buttom = browser.find_element_by_css_selector('a[class^="zbtn znxt"]')
nextpage_button = browser.find_element_by_link_text('下一页')
#点击按键
browser.execute_script("arguments[0].click();", nextpage_button)

6. 完整代码

运行完需要点时间,爬取三千页,大概半个小时,不想等那么久的可以找一首评论没那么多的歌曲。

from selenium import webdriver#无界面启动
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(options=chrome_options)
#有界面启动
#browser = webdriver.Chrome()
#隐式等待 3秒
browser.implicitly_wait(3)
browser.get('https://music.163.com/#/song?id=1408763442')
#切换子页面
browser.switch_to.frame('g_iframe')
#print(browser.page_source)#首页
hot_message_name = []
hot_message_commet = []
message_name = []
message_commet = []
commet = browser.find_elements_by_css_selector('.cnt.f-brk')
for each in range(len(commet)):if each < 15:       #热门评论hot_message_name.append(commet[each].text.split(':')[0])hot_message_commet.append(commet[each].text.split(':')[1])else:         #全部评论message_name.append(commet[each].text.split(':')[0])message_commet.append(commet[each].text.split(':')[1])#print(commet[each].text)
#print(len(commet))#总页数
pagecount_button = browser.find_element_by_css_selector('a[class^="zpgi zpg9 "]')
pagecount = int(pagecount_button.text)
print(pagecount_button.text)for page in range(pagecount -1):
#for page in range(200):print(page)# 下一页#buttom = browser.find_element_by_css_selector('a[class^="zbtn znxt"]')nextpage_button = browser.find_element_by_link_text('下一页')#点击按键browser.execute_script("arguments[0].click();", nextpage_button)#print(buttom[0].text)#评论信息commet = browser.find_elements_by_css_selector('.cnt.f-brk')for each in range(len(commet)):message_name.append(commet[each].text.split(':')[0])message_commet.append(commet[each].text.split(':')[1])#评论信息commet = browser.find_elements_by_css_selector('.cnt.f-brk')for each in range(len(commet)):message[commet[each].text.split(':')[0]] = commet[each].text.split(':')[1]#写入文件
#热门评论
with open('hot_comments.txt','w',encoding='utf-8') as f:for i in range(len(hot_message_name)):f.write(hot_message_name[i] + ':\n\n')f.write(hot_message_commet[i] + '\n')f.write('--------------------------------\n')#全部评论
with open('comments.txt','w',encoding='utf8') as f:for i in range(len(message_name)):f.write(message_name[i] + ':\n\n')f.write(message_commet[i] + '\n')f.write('--------------------------------\n')
browser.close()

200页结果,16633行,大概4行一个评论。
166633/4 = 4158.25
200页4015个评论(热评15个)。

Selenium解决动态渲染页面----爬取网易云音乐全部评论相关推荐

  1. 抄袭风波后 爬取网易云音乐看评论画风如何

    作者 | 小F 来源 | 法纳斯特(ID:walker398) 近日,民谣歌手花粥被爆出涉嫌抄袭. 具体的我就不细说了,音乐圈的抄袭风波也是喜闻乐见. 比如,李袁杰的「离人愁」,展展与罗罗的「沙漠骆驼 ...

  2. python爬虫网易云音乐评论再分析_爬取网易云音乐的评论后,竟有这种发现!

    原标题:爬取网易云音乐的评论后,竟有这种发现! 作者 | 志颖 责编 | 胡巍巍 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条. 现在 ...

  3. Python 爬取网易云音乐所有评论

    题图:by cfunk44 from Instagram 在使用 Ajax 技术加载数据的网站中, JavaScript 发起的 HTTP 请求通常需要带上参数,而且参数的值都是经过加密的.如果我们想 ...

  4. python爬取音乐并保存_Python爬取网易云音乐上评论火爆的歌曲

    前言 网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其中也不乏很多感人的评论.但是,网易云音乐并没有提供热评排行 ...

  5. python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...

    网易云音乐评论爬虫(三):爬取歌曲的全部评论 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的 ...

  6. PHP爬虫爬取网易云音乐热门评论

    说起爬虫,恐怕第一个想到的都是Python,PHP的就少之又少. 得空闲下来,自己用PHP做了一个爬虫,爬取网易云音乐的热门评论. 效果图: 下面简单说一下思路 首先,在网易云官网排行榜内,审查元素, ...

  7. python爬虫网易云音乐评论再分析_Scrapy爬取网易云音乐和评论(一、思路分析)...

    目录: 前提: scrapy这个框架很多人用过,网上教程也很多,但大多就是爬爬小说这种比较简单且有规律的.尤其大多网站它是可以通过点击下一页的方式爬取下一页,我看到的教程也都是这样的.而网易云的按钮光 ...

  8. python爬取网易云音乐歌曲评论信息

    网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了"它比我还懂我的音乐喜好"."小清新的界面设计"就是它独有的评论区了------各种故 ...

  9. python爬虫-爬取网易云音乐歌曲评论

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 以及@lyrichu的博客 https://www.cnblogs.com/lyric ...

最新文章

  1. MAC如何查看某个端口的占用情况
  2. python弹出警告框_selenium+webdriver+python 中警告框的处理方法
  3. 全球及中国超导磁铁探针台行业现状规模及“十四五”发展趋势预测报告2021-2027年版
  4. cocos2d-x史上最著名的诗
  5. 神经网络画图-ConvNetDraw(简单实用)
  6. php编写文章发布程序教程,PHP开发文章发布系统之后台文章修改处理程序
  7. Linux开机启动一些知识点
  8. 使用Arcpy进行数据批处理-批量裁剪
  9. 项目管理九要与八不要
  10. 手机网速测试软件排行榜,手机测网速软件,几款测速软件推荐
  11. 基于stm32的自动调速风扇
  12. Zookeeper之数据同步原理
  13. linux代码丢了,Linux 使用ss命令代替 netstat
  14. 基于STM32设计的实时心率检测仪
  15. Docker学习笔记 — Swarm搭建Docker集群
  16. 计算机视觉PyTorch迁移学习 - (二)
  17. 为什么要格式化namenode以及注意点
  18. Spring boot开发小而美的个人博客
  19. 2012暑期川西旅游之第八天(青城山-成都)
  20. 磁场强度H和磁感应强度B的区别

热门文章

  1. android开源新闻小程序、3D翻转公告效果、小说检索、Kotlin开发TODO清单等源码...
  2. 基于ABP vNext 4.X(.Net 5)的Blazor项目创建及配置
  3. 手机连接电脑用GPRS上网设置方法
  4. Excel VBA UserForm用户窗体中添加按钮,并进行选择
  5. 基于STM32的BMS电池管理系统源代码配官方参考原理图
  6. SACC2018问答录
  7. JSNES连发和连跳
  8. android adb shell device not found 或 adb devices 无设备
  9. 正弦波形的音频文件生成工具CreatSineWav_v2.2使用介绍
  10. VS2019编译器修改背景壁纸(写代码背景不再单薄,试试换一张清晰的美女照片)