日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/20 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫采集网易云音乐热评实战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前一段時(shí)間剛剛?cè)腴T(mén)python爬蟲(chóng),有大概半個(gè)月時(shí)間沒(méi)有寫(xiě)python了,都快遺忘了。于是準(zhǔn)備寫(xiě)個(gè)簡(jiǎn)單的爬蟲(chóng)練練手,我覺(jué)得網(wǎng)易云音樂(lè)最優(yōu)特色的就是其精準(zhǔn)的歌曲推薦和獨(dú)具特色的用戶(hù)評(píng)論,于是寫(xiě)了這個(gè)抓取網(wǎng)易云音樂(lè)熱歌榜里的熱評(píng)的爬蟲(chóng)。我也是剛剛?cè)腴T(mén)爬蟲(chóng),有什么意見(jiàn)和問(wèn)題歡迎提出,大家一起共同進(jìn)步。
廢話(huà)就不多說(shuō)了~

很多人學(xué)習(xí)python,不知道從何學(xué)起。
很多人學(xué)習(xí)python,掌握了基本語(yǔ)法過(guò)后,不知道在哪里尋找案例上手。
很多已經(jīng)做案例的人,卻不知道如何去學(xué)習(xí)更加高深的知識(shí)。
那么針對(duì)這三類(lèi)人,我給大家提供一個(gè)好的學(xué)習(xí)平臺(tái),免費(fèi)領(lǐng)取視頻教程,電子書(shū)籍,以及課程的源代碼!??¤
QQ群:623406465


我們的目標(biāo)是爬取網(wǎng)易云中的熱歌排行榜中所有歌曲的熱門(mén)評(píng)論。
這樣既可以減少我們需要爬取的工作量,又可以保存到高質(zhì)量的評(píng)論。

首先,我們打開(kāi)網(wǎng)易云網(wǎng)頁(yè)版,如圖:

點(diǎn)擊排行榜,然后點(diǎn)擊左側(cè)云音樂(lè)熱歌榜,如圖:

我們先隨便打開(kāi)一個(gè)歌曲,找到如何抓取指定的歌曲的熱門(mén)歌評(píng)的方法,如圖,我選了一個(gè)最近我比較喜歡的歌曲為例:

進(jìn)去后我們會(huì)看到歌評(píng)就在這個(gè)頁(yè)面的下面,接下來(lái)我們就要想辦法獲取這些評(píng)論。

接下來(lái)打開(kāi)web控制臺(tái)(chrome的話(huà)打開(kāi)開(kāi)發(fā)者工具,如果是其他瀏覽器應(yīng)該也是類(lèi)似),chrome下按F12,如圖:

選則Network,然后我們按F5刷新一下,刷新之后得到的數(shù)據(jù)如下圖所示:

可以看到瀏覽器發(fā)送了非常多的信息,那么哪一個(gè)才是我們想要的呢?這里我們可以通過(guò)狀態(tài)碼做一個(gè)初步的判斷,status code(狀態(tài)碼)標(biāo)志了服務(wù)器請(qǐng)求的狀態(tài),這里狀態(tài)碼為200即表示請(qǐng)求正常,而304則表示不正常(狀態(tài)碼種類(lèi)非常多,如果要想詳細(xì)了解可以自行搜索,這里不說(shuō)304具體的含義了)。所以我們一般只用看狀態(tài)碼為200的請(qǐng)求就可以了,還有就是,我們可以通過(guò)右邊欄的預(yù)覽來(lái)粗略觀察服務(wù)器返回了什么信息(或者查看響應(yīng))。通過(guò)這兩種方法結(jié)合一般我們就可以快速找到我們想要分析的請(qǐng)求。通過(guò)反復(fù)的查找,終于找到了含有歌評(píng)的請(qǐng)求,如圖:

可能截圖在CSDN上不是很清楚,我們?cè)谝粋€(gè)Name為R_SO_4_489998494?csrf_token=的POST請(qǐng)求中找到了包含這首歌的歌評(píng)。我們把這個(gè)分塊截圖發(fā)出來(lái),這樣可以看的清楚一些:

請(qǐng)求基本信息:

請(qǐng)求頭部:

請(qǐng)求中的表單數(shù)據(jù):

我們可以看到,包含這首歌歌評(píng)的請(qǐng)求url為http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token=?,我們換了幾首歌后發(fā)現(xiàn),這個(gè)請(qǐng)求的前部分都是一樣的,只是R_SO_4_后面緊跟的一串?dāng)?shù)字不一樣。我們可以推測(cè)出,每一首歌都有一個(gè)指定的id,R_SO_4_后面緊跟的就是這首歌的id。

我們?cè)倏匆幌绿峤坏谋韱螖?shù)據(jù),我們會(huì)發(fā)現(xiàn)表單中需要填兩個(gè)數(shù)據(jù),名稱(chēng)為params和encSecKey。后面緊跟的是一大串字符,換幾首歌會(huì)發(fā)現(xiàn),每首歌的params和encSecKey都是不一樣的,因此,這兩個(gè)數(shù)據(jù)可能經(jīng)過(guò)一個(gè)特定的算法進(jìn)行加密過(guò)的。

服務(wù)器返回的和評(píng)論相關(guān)的數(shù)據(jù)為json格式的,里面含有非常豐富的信息(比如有關(guān)評(píng)論者的信息,評(píng)論日期,點(diǎn)贊數(shù),評(píng)論內(nèi)容等等),其中hotComments就是我們要找的熱門(mén)評(píng)論,總共15條,如圖所示:

至此,我們已經(jīng)確定了方向了,即只需要確定params和encSecKey這兩個(gè)參數(shù)值即可。但是這兩個(gè)參數(shù)是經(jīng)過(guò)特定的算法進(jìn)行加密的,怎么辦呢?我發(fā)現(xiàn)了一個(gè)規(guī)律,http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token=中 R_SO_4_后面的數(shù)字就是這首歌的id值,而對(duì)于不同的歌曲的param和encSecKey值,如果把一首歌比如A的這兩個(gè)參數(shù)值傳給B這首歌,那么對(duì)于相同的頁(yè)數(shù),這種參數(shù)是通用的,即A的第一頁(yè)的兩個(gè)參數(shù)值傳給其他任何一首歌的兩個(gè)參數(shù),都可以獲得相應(yīng)歌曲的第一頁(yè)的評(píng)論,對(duì)于第二頁(yè),第三頁(yè)等也是類(lèi)似。
而我們其實(shí)只需要獲取第一頁(yè)的15條熱門(mén)評(píng)論,所以我們只需要隨便找一首歌,將這首歌第一頁(yè)中的該請(qǐng)求中的params和encSecKey這兩個(gè)參數(shù)值復(fù)制下來(lái),就可以使用了。
關(guān)于這兩個(gè)參數(shù)如何解密,強(qiáng)大的知乎上其實(shí)已經(jīng)有答案的了,感興趣的朋友可以進(jìn)去看一下(https://www.zhihu.com/question/36081767),我們?cè)谶@里就只需要用我們這種偷懶的辦法就可以完成需求了,xixi。

到此為止,我們?nèi)绾巫ト【W(wǎng)易云音樂(lè)的熱門(mén)評(píng)論已經(jīng)分析完了,我們?cè)俜治鲆幌氯绾潍@取云音樂(lè)熱歌榜中所有歌曲的信息。

我們需要獲取云音樂(lè)熱歌榜中的所有歌曲的歌曲名和對(duì)應(yīng)的id值。
跟上面的分析步驟類(lèi)似,我們先進(jìn)入熱歌榜的網(wǎng)址,如圖:

按F12,進(jìn)入WEB工作臺(tái),如圖:

我們?cè)谝粋€(gè)名為toplist?id=3778678的GET請(qǐng)求中,找到了該榜單的所有歌曲信息。

請(qǐng)求對(duì)應(yīng)的信息如圖:

我們預(yù)覽一下該請(qǐng)求返回的結(jié)果,如圖:

我們?cè)诖a的第524行我們找到了包含歌曲信息的代碼,如圖:

因此,我們只需要將該請(qǐng)求的代碼中,將包含信息的代碼篩選出來(lái)。
我們?cè)谶@里使用正則表達(dá)式進(jìn)行數(shù)據(jù)篩選。
通過(guò)觀察特點(diǎn),我們可以通過(guò)兩次正則表達(dá)式的篩選,將我們需要的歌曲信息提取出來(lái)。
第一次正則表達(dá)式我們將該請(qǐng)求返回的所有代碼中,提取出第525行代碼。
第一次正則表達(dá)式如下:<ul class="f-hide"><li><a href="/song\?id=\d*?">.*</a></li></ul>

第二次正則表達(dá)式我們將該第524行中我們需要的歌曲信息提取出來(lái),我們需要歌曲的歌名和id,對(duì)應(yīng)的正則表達(dá)式如下:
獲取歌名:<li><a href="/song\?id=\d*?">(.*?)</a></li>
獲取歌曲的id:<li><a href="/song\?id=(\d*?)">.*?</a></li>

到此,我們整個(gè)過(guò)程已經(jīng)分析完了,上代碼看具體細(xì)節(jié)~~
代碼如下:

#!/usr/bin/env python3 # -*- coding: utf-8 -*-import re import urllib.request import urllib.error import urllib.parse import jsondef get_all_hotSong(): #獲取熱歌榜所有歌曲名稱(chēng)和idurl='http://music.163.com/discover/toplist?id=3778678' #網(wǎng)易云云音樂(lè)熱歌榜urlheader={ #請(qǐng)求頭部'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') #打開(kāi)urlhtml=str(html) #轉(zhuǎn)換成strpat1=r'<ul class="f-hide"><li><a href="/song\?id=\d*?">.*</a></li></ul>' #進(jìn)行第一次篩選的正則表達(dá)式result=re.compile(pat1).findall(html) #用正則表達(dá)式進(jìn)行篩選result=result[0] #獲取tuple的第一個(gè)元素pat2=r'<li><a href="/song\?id=\d*?">(.*?)</a></li>' #進(jìn)行歌名篩選的正則表達(dá)式pat3=r'<li><a href="/song\?id=(\d*?)">.*?</a></li>' #進(jìn)行歌ID篩選的正則表達(dá)式hot_song_name=re.compile(pat2).findall(result) #獲取所有熱門(mén)歌曲名稱(chēng)hot_song_id=re.compile(pat3).findall(result) #獲取所有熱門(mén)歌曲對(duì)應(yīng)的Idreturn hot_song_name,hot_song_iddef get_hotComments(hot_song_name,hot_song_id):url='http://music.163.com/weapi/v1/resource/comments/R_SO_4_' + hot_song_id + '?csrf_token=' #歌評(píng)urlheader={ #請(qǐng)求頭部'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請(qǐng)求表單數(shù)據(jù)data={'params':'zC7fzWBKxxsm6TZ3PiRjd056g9iGHtbtc8vjTpBXshKIboaPnUyAXKze+KNi9QiEz/IieyRnZfNztp7yvTFyBXOlVQP/JdYNZw2+GRQDg7grOR2ZjroqoOU2z0TNhy+qDHKSV8ZXOnxUF93w3DA51ADDQHB0IngL+v6N8KthdVZeZBe0d3EsUFS8ZJltNRUJ','encSecKey':'4801507e42c326dfc6b50539395a4fe417594f7cf122cf3d061d1447372ba3aa804541a8ae3b3811c081eb0f2b71827850af59af411a10a1795f7a16a5189d163bc9f67b3d1907f5e6fac652f7ef66e5a1f12d6949be851fcf4f39a0c2379580a040dc53b306d5c807bf313cc0e8f39bf7d35de691c497cda1d436b808549acc'}postdata=urllib.parse.urlencode(data).encode('utf8') #進(jìn)行編碼request=urllib.request.Request(url,headers=header,data=postdata)reponse=urllib.request.urlopen(request).read().decode('utf8')json_dict=json.loads(reponse) #獲取jsonhot_commit=json_dict['hotComments'] #獲取json中的熱門(mén)評(píng)論num=0fhandle=open('./song_comments','a') #寫(xiě)入文件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() #獲取熱歌榜所有歌曲名稱(chēng)和idnum=0 while num < len(hot_song_name): #保存所有熱歌榜中的熱評(píng)print('正在抓取第%d首歌曲熱評(píng)...'%(num+1))get_hotComments(hot_song_name[num],hot_song_id[num])print('第%d首歌曲熱評(píng)抓取成功'%(num+1))num+=1

代碼運(yùn)行結(jié)果如下:

對(duì)比一下網(wǎng)頁(yè)上《如果我愛(ài)你》這首歌的歌評(píng)和我們保存下的歌評(píng):

信息無(wú)誤~

總結(jié)

以上是生活随笔為你收集整理的Python爬虫采集网易云音乐热评实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。