首先打开网易云音乐,打开你想爬取的评论的页面,然后f12,发现是能找到评论的
,然后我们打开网页源代码,搜索评论,发现源代码中并没有评论的相关信息,这表明评论信息是js代码,是加密了的动态页面,一般我们爬取的是静态的,即源代码当中能直接找到的我们能看见的数据,这时候用正则表达式匹配则可以爬取成功,而动态页面,我们得在XHR里捕获它的请求信息
这里抓包有个小技巧,即比对它的id,这样子就不用每个都去看一下是不是我们要的包
可以看到这是一个post请求,而Resquest URL则是我们要的数据的地址,点开preview,可以发现我们要的数据就在hotComments里面
怎么爬呢,既然是个post请求,我们可以用模拟浏览器向服务器发送请求的方法,来解析页面,这样做就可以直接用它加密即表单里的数据,而不是先去解密再解析页面,如图
然后利用json来获取我们想要的键值对关系的评论数据就可以了。
下面是我的源代码:
#encoding:utf8 import requests import re import json url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_545922868?csrf_token=" headers = { 'Host':"music.163.com", 'Origin':'https://music.163.com', 'Referer':'https://music.163.com/song?id=545922868', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', } data = { 'params':"+C7GdwabX3V3pnW5pJGQWQcfOByDUKz5qrT24HkmK7EKYuDq4gNyM4S3UvKx7+s68ANR7n7yAU0MNsZWVwNOKljmd3HABOHiyiFEEXslfOqv4c5p49h8XnH/fnFF+dBIqLsJQjjWhvrfXx66bIWOBB1J+I9SH0Y+ixRt/fIT6LegMOGfytqGk83BTouH3N9O", 'encSecKey':"c4a66b9b1d8c7accc431eb3c85e502acc0a4a7c3e7fe01c9018f2a3b3f0c98fa91fbf2764ca7b00a3d386fa6457bf621f4f0e63930805d12c7d5a9bff9176ad2c2f580256ec043e3a307c35105ba91a0d60a4abec672758ab45f14044af122b457298b37e7530280a51f7905e82eb0bff9fa7397c76e839080401f28903565be", } html = requests.post(url,headers=headers,data=data).text comments = json.loads(html) comments = comments['hotComments'] for i in comments: print(i['commentId'],i['content'])
这是我爬取的结果: