网易云音乐评论爬取
收集歌单id
每个歌单都有唯一的id,通过 https://music.163.com/# 这个链接就可以找到歌单,所以第一步我们要收集发现音乐下的多个歌单id
首先进入官网的“发现音乐”的“歌单”一栏,这里可以看到很多高分歌单,先到处点一下,可以发现链接是在改变的,说明部分数据不是动态加载的,可通过网页源码获得。最后发现链接有cat,order,offset,和limit四个对我们有用的参数,cat是分类,order是排序,offset=(页数-1)*35,limit=35。还有注意使用前要把链接的井号和一个斜杠去掉,否者会导致网页源码缺失。
先随便找一条链接requests一下先,可以发现目标信息是完整的,和F12看到的源码一样,那歌单id就可以放心提取了
1 | def get_playlists(pages,order,cat):#页数(一页获取35个歌单id),排序,分类 |
收集歌单內歌曲id
每个歌单都有多首歌曲,所以第二步我们要获取每个歌单下的所有歌曲id顺便把歌单名也获取。
歌单链接是http://music.163.com/playlist...,先随便找一个requests一下先,目标没缺失但是requests结果是和F12源码是不同的,筛选时请照着requests结果写(requests结果只有id和歌名,暂时够用那就这样吧)(网易云现在必须登录验证了)
另一种方法是通过API获取,包含更全的信息(包括歌手,所属专辑,歌单介绍等)。
1 | def get_songs(playlist_id='778462085'): |
请求动态数据(评论)
进入某首歌 https://music.163.com/#/song?id=721243 ,很自然就想到requests一下,然而这不会得到任何评论信息,因为评论区是动态加载的(翻页链接不变,动态标志),所以打开F12捉包吧,在xhr中查看response很快找到。
请求链接中“R_SO_4_”后接的是歌曲的id,同一首歌下不同页数的动态包的请求链接除csrf_token外是相同的。
请求类型为post,需要两个参数,无论是刷新还是评论翻页这两个参数都会变,应该是加密过的。
先不理加密先,尝试把第一页的两个参数传给请求链接是能获得数据的,对应第一页的评论,尝试把csrf_token参数去除,还是能获取数据,所以csrf_token参数可以不要。我们大胆一点,继续把这对参数传给不同歌曲的请求链接,发现都能获取对应的第一页评论;而把第二页的两个参数传给不同歌曲的请求链接,就会得到对应第二页评论,以此类推。所以得出结论,任一页数的两个参数对不同歌曲是通用的,第n页的参数post过去会得到第n页的评论。这样就成功绕过了加密问题。
如果你要大量爬取评论/各种信息时,加密算法就显得很重要。
1 | def get_comments(arg): # 接收get_songs方法返回的数据,爬取页数等 |
1 | import json |