爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例。毛不易–水乡
一、常规方法
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=</