Python爬虫采集网易云音乐热评实战( 二 )


到此为止 , 我们如何抓取网易云音乐的热门评论已经分析完了 , 我们再分析一下如何获取云音乐热歌榜中所有歌曲的信息 。
我们需要获取云音乐热歌榜中的所有歌曲的歌曲名和对应的id值 。 跟上面的分析步骤类似 , 我们先进入热歌榜的网址 , 如图:
Python爬虫采集网易云音乐热评实战文章插图
?
按F12 , 进入WEB工作台 , 如图:
Python爬虫采集网易云音乐热评实战文章插图
?
我们在一个名为toplist?id=3778678的GET请求中 , 找到了该榜单的所有歌曲信息 。
请求对应的信息如图:
Python爬虫采集网易云音乐热评实战文章插图
?
我们预览一下该请求返回的结果 , 如图:
Python爬虫采集网易云音乐热评实战文章插图
?
我们在代码的第524行我们找到了包含歌曲信息的代码 , 如图:
Python爬虫采集网易云音乐热评实战文章插图
?
因此 , 我们只需要将该请求的代码中 , 将包含信息的代码筛选出来 。 我们在这里使用正则表达式进行数据筛选 。 通过观察特点 , 我们可以通过两次正则表达式的筛选 , 将我们需要的歌曲信息提取出来 。 第一次正则表达式我们将该请求返回的所有代码中 , 提取出第525行代码 。 第一次正则表达式如下:

  • .*

第二次正则表达式我们将该第524行中我们需要的歌曲信息提取出来 , 我们需要歌曲的歌名和id , 对应的正则表达式如下:获取歌名:
  • (.*?)
  • 获取歌曲的id:
  • .*?

  • 到此 , 我们整个过程已经分析完了 , 上代码看具体细节~~代码如下:
    #!/usr/bin/env python3# -*- coding: utf-8 -*-import reimport urllib.requestimport urllib.errorimport urllib.parseimport jsondef get_all_hotSong():#获取热歌榜所有歌曲名称和idurl=''#网易云云音乐热歌榜urlheader={#请求头部'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}request=urllib.request.Request(url=url, headers=header)html=urllib.request.urlopen(request).read().decode('utf8')#打开urlhtml=str(html)#转换成strpat1=r'
    • .*
    '#进行第一次筛选的正则表达式result=re.compile(pat1).findall(html)#用正则表达式进行筛选result=result[0]#获取tuple的第一个元素pat2=r'
  • (.*?)
  • ' #进行歌名筛选的正则表达式pat3=r'
  • .*?
  • '#进行歌ID筛选的正则表达式hot_song_name=re.compile(pat2).findall(result)#获取所有热门歌曲名称hot_song_id=re.compile(pat3).findall(result)#获取所有热门歌曲对应的Idreturn hot_song_name,hot_song_iddef get_hotComments(hot_song_name,hot_song_id):url='' + hot_song_id + '?csrf_token='#歌评urlheader={#请求头部'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}#post请求表单数据data=http://kandian.youth.cn/index/{'params':'zC7fzWBKxxsm6TZ3PiRjd056g9iGHtbtc8vjTpBXshKIboaPnUyAXKze+KNi9QiEz/IieyRnZfNztp7yvTFyBXOlVQP/JdYNZw2+GRQDg7grOR2ZjroqoOU2z0TNhy+qDHKSV8ZXOnxUF93w3DA51ADDQHB0IngL+v6N8KthdVZeZBe0d3EsUFS8ZJltNRUJ','encSecKey':'4801507e42c326dfc6b50539395a4fe417594f7cf122cf3d061d1447372ba3aa804541a8ae3b3811c081eb0f2b71827850af59af411a10a1795f7a16a5189d163bc9f67b3d1907f5e6fac652f7ef66e5a1f12d6949be851fcf4f39a0c2379580a040dc53b306d5c807bf313cc0e8f39bf7d35de691c497cda1d436b808549acc'}postdata=http://kandian.youth.cn/index/urllib.parse.urlencode(data).encode('utf8')#进行编码request=urllib.request.Request(url,headers=header,data=http://kandian.youth.cn/index/postdata)reponse=urllib.request.urlopen(request).read().decode('utf8')json_dict=json.loads(reponse)#获取jsonhot_commit=json_dict['hotComments']#获取json中的热门评论num=0fhandle=open('./song_comments','a')#写入文件fhandle.write(hot_song_name+':'+'\n')for item in hot_commit:num+=1fhandle.write(str(num)+'.'+item['content']+'\n')fhandle.write('\n==============================================\n\n') fhandle.close()hot_song_name,hot_song_id=get_all_hotSong()#获取热歌榜所有歌曲名称和idnum=0while num < len(hot_song_name):#保存所有热歌榜中的热评print('正在抓取第%d首歌曲热评...'%(num+1))get_hotComments(hot_song_name[num],hot_song_id[num])print('第%d首歌曲热评抓取成功'%(num+1))num+=1
    代码运行结果如下:
    Python爬虫采集网易云音乐热评实战文章插图
    ?
    对比一下网页上《如果我爱你》这首歌的歌评和我们保存下的歌评:
    Python爬虫采集网易云音乐热评实战文章插图