200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python爬虫----网易云音乐之热门评论

python爬虫----网易云音乐之热门评论

时间:2019-10-01 01:57:03

相关推荐

python爬虫----网易云音乐之热门评论

上次爬取了歌手的热门歌曲,这次就来爬取热门歌曲的热门评论

热门评论可没歌曲那么容易搞到手,还好有前辈们写过类似的爬虫,所以有许多资料参考。

lyrichu这位作者也写了一篇关于网易云热门评论的爬虫,写的很详细,可以去看看

/lyrichu/p/6635798.html

关于爬取热门评论的主要难点就是,在歌曲评论的页面用一般方法去爬会获取不到数据。

通过审查元素找到这个

这上面的request url:/weapi/v1/resource/comments/R_SO_4_186016?csrf_token=c7e805bd515022659ffce692fe41a1b3

自己打不开,用爬虫也得不到数据。值得注意的是这里用的方法是POST而不是GET,但无论是GET还是POST都不行。

经过一番查找,只需要确定params和encSceKey两个参数,就能得到评论。

这俩参数是加过密的,要想得到所有的评论就必须知道加密的方式。有许多人已经破解加密的方式了,有兴趣可以去看看/question/21471960这个问题里@路人甲的回答和/question/36081767这个问题@平胸小仙女的回答

既然我们爬的是热门评论,就是单独的一页评论,params和encSceKey两个参数直接拿来用就好。

经测试params和encSceKey两个参数可以用在不同的歌曲的热门评论。

还有一点URL中R_SO_4_186016数字部分就是歌曲的id,后面csrf_token=c7e805bd515022659ffce692fe41a1b3这段在换了歌曲id后没有影响。

现在就可以开始爬取了,但我遇到一个异常

我以为是r.encoding那里有问题,就改成了r.encoding = r.apparent_encoding。结果得到

呃.....一堆乱码。后面用print(r.apparent_encoding)显示的是windos-1245,原本的r.encoding是utf-8。

没办法只好去搜下那个出现的异常,又是一番搜索。终于在/question/28704728这里找到了答案

具体方法是

这里要import sys,来执行sys.maxunicode

用这段代码就可以正常的显示出来所爬去的东西了。关于这段代码的详细解释可以看/questions/32442608/ucs-2-codec-cant-encode-characters-in-position-1050-1050。就是出现这种异常的解决办法。

因为我们爬取得到的数据是json,因此我们要引入json包,用json_data = json.loads(data)这条语句就可以解析json数据了。

/这是个在线json校验格式化工具,在这个网站可以清晰的看到json的结构,方面我们抓取数据。

代码:

import requestsimport refrom bs4 import BeautifulSoupimport sysimport jsonimport osdef get_song_id(url):try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingexcept:print('wrong!!!!!!!')html = r.textsoup = BeautifulSoup(html,'html.parser')song = soup.find_all('ul',attrs = {'class':'f-hide'})[0]all_song_id = re.findall(r'<a href="/song\?id=(\d+)">(.*?)</a>',str(song))print(all_song_id)return all_song_iddef get_hotcontent(url):song_list = get_song_id(url)fpath = 'E:/python/网易云音乐热门评论----周杰伦'os.makedirs(fpath)os.chdir(fpath)non_bmp_map = dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd)for single_id in song_list:get_content_url = '/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=86377c99d2ebe6570c4146676b9cb36d'.format(single_id[0])param = {'params':'h84Z4kuySxni4TTba7U9khiYWVea9p8Gr+Vlh93EjFPNCtBGh+BTr7BMvx1M3a8FQ9X2UW4Pvif5zCy1gxuR+Ap/52ddf+pXrXlpTIrlkJEtnW0VCiBx7wm7UhFC47JUPtMlvsvm0NJZ+E57lBKHkUzuW3j12gWwnB1Qkvmbl3AC9912lUQIeWCyhN+V3n90yD+3jXxQBLQRDxlZIUWx81/UwV0RhY6kfLxIbZPghFI=','encSecKey':'526f02ffc615b9d13974e44ac551608e65a6d14b0adcc05d7cbe86c368aebef465e451a6250de12664a6faf585d567b24a9871a282aff757df2983584c7d5db2d12bbebdaa93b20d8fc65a4d0852ad01b0d450b0cf7373b2b5089edcc394d00925fd82a1e7e11e497f6ab9780cc3280ab3328fc4822d925b137d7bc8721d0f75'}header = {'Host':'','Origin':'','Referer':'/song?id='.format(single_id[0]),'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}try:r = requests.post(get_content_url, headers = header, data = param)except:print('获取评论失败!')continuedata = r.text.translate(non_bmp_map)#print(data)json_data = json.loads(data)hotcomment = json_data['hotComments']print('歌曲:' + str(single_id[1]) + '\n')Info = []for i in range(len(hotcomment)):user_name = hotcomment[i]['user']['nickname']comment = hotcomment[i]['content']like_num = hotcomment[i]['likedCount']Info.append([str(i + 1),user_name,like_num,comment])print('No.'+ str(i + 1))print('用户名:'+ str(user_name) + '\t' + '点赞:'+ str(like_num))print('评论:'+ comment + '\n')print('........................................................\n\n')save(fpath,single_id,Info)def save(fpath,single_id,Info):final_fpath = fpath + '/' +str(single_id[1]) + '.txt'with open(final_fpath,'w',encoding = 'utf-8') as f:f.write('歌曲名称:'+ str(single_id[1]) + '\n\n')for i in Info:f.write('No.'+ str(i[0]) + '\n')f.write('用户名:'+ str(i[1]) + '\t' + '点赞:' + str(i[2]) + '\n')f.write('评论:'+ str(i[3]) + '\n\n')def main():url = '/artist?id=6452'get_hotcontent(url)main()

lyrichu

lyrichu

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。