国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python3實戰之爬蟲抓取網易云音樂的熱門評論

2020-01-04 16:34:02
字體:
來源:轉載
供稿:網友

前言

之前剛剛入門python爬蟲,有大概半個月時間沒有寫python了,都快遺忘了。于是準備寫個簡單的爬蟲練練手,我覺得網易云音樂最優特色的就是其精準的歌曲推薦和獨具特色的用戶評論,于是寫了這個抓取網易云音樂熱歌榜里的熱評的爬蟲。我也是剛剛入門爬蟲,有什么意見和問題歡迎提出,大家一起共同進步。

廢話就不多說了~下面來一起看看詳細的介紹吧。

我們的目標是爬取網易云中的熱歌排行榜中所有歌曲的熱門評論。

這樣既可以減少我們需要爬取的工作量,又可以保存到高質量的評論。

實現分析

首先,我們打開網易云網頁版,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

點擊排行榜,然后點擊左側云音樂熱歌榜,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

我們先隨便打開一個歌曲,找到如何抓取指定的歌曲的熱門歌評的方法,如圖,我選了一個最近我比較喜歡的歌曲為例:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

進去后我們會看到歌評就在這個頁面的下面,接下來我們就要想辦法獲取這些評論。

接下來打開web控制臺(chrom的話打開開發者工具,如果是其他瀏覽器應該也是類似),chrom下按F12,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

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

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

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

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

可能截圖在CSDN上不是很清楚,我們在一個Name為R_SO_4_489998494?csrf_token=的POST請求中找到了包含這首歌的歌評。我們把這個分塊截圖發出來,這樣可以看的清楚一些:

請求基本信息:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

請求頭部:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

請求中的表單數據:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

我們可以看到,包含這首歌歌評的請求url為http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= ,我們換了幾首歌后發現,這個請求的前部分都是一樣的,只是R_SO_4_后面緊跟的一串數字不一樣。我們可以推測出,每一首歌都有一個指定的id,R_SO_4_后面緊跟的就是這首歌的id。

我們再看一下提交的表單數據,我們會發現表單中需要填兩個數據,名稱為params和encSecKey。后面緊跟的是一大串字符,換幾首歌會發現,每首歌的params和encSecKey都是不一樣的,因此,這兩個數據可能經過一個特定的算法進行加密過的。

服務器返回的和評論相關的數據為json格式的,里面含有非常豐富的信息(比如有關評論者的信息,評論日期,點贊數,評論內容等等),其中hotComments就是我們要找的熱門評論,總共15條,如圖所示:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

至此,我們已經確定了方向了,即只需要確定params和encSecKey這兩個參數值即可。但是這兩個參數是經過特定的算法進行加密的,怎么辦呢?我發現了一個規律,http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= 中 R_SO_4_后面的數字就是這首歌的id值,而對于不同的歌曲的param和encSecKey值,如果把一首歌比如A的這兩個參數值傳給B這首歌,那么對于相同的頁數,這種參數是通用的,即A的第一頁的兩個參數值傳給其他任何一首歌的兩個參數,都可以獲得相應歌曲的第一頁的評論,對于第二頁,第三頁等也是類似。

而我們其實只需要獲取第一頁的15條熱門評論,所以我們只需要隨便找一首歌,將這首歌第一頁中的該請求中的params和encSecKey這兩個參數值復制下來,就可以使用了。

關于這兩個參數如何解密,強大的知乎上其實已經有答案的了,感興趣的朋友可以進去看一下(https://www.zhihu.com/question/36081767),我們在這里就只需要用我們這種偷懶的辦法就可以完成需求了,xixi。

到此為止,我們如何抓取網易云音樂的熱門評論已經分析完了,我們再分析一下如何獲取云音樂熱歌榜中所有歌曲的信息。

我們需要獲取云音樂熱歌榜中的所有歌曲的歌曲名和對應的id值。

跟上面的分析步驟類似,我們先進入熱歌榜的網址,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

按F12,進入WEB工作臺,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

我們在一個名為toplist?id=3778678的GET請求中,找到了該榜單的所有歌曲信息。

請求對應的信息如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

我們預覽一下該請求返回的結果,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

我們在代碼的第524行我們找到了包含歌曲信息的代碼,如圖:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

因此,我們只需要將該請求的代碼中,將包含信息的代碼篩選出來。

我們在這里使用正則表達式進行數據篩選。

通過觀察特點,我們可以通過兩次正則表達式的篩選,將我們需要的歌曲信息提取出來。

第一次正則表達式我們將該請求返回的所有代碼中,提取出第525行代碼。

第一次正則表達式如下:<ul class="f-hide"><li><a href="/song/?id=/d*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >.*</a></li></ul>

第二次正則表達式我們將該第524行中我們需要的歌曲信息提取出來,我們需要歌曲的歌名和id,對應的正則表達式如下:

獲取歌名:<li><a href="/song/?id=/d*?" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >(.*?)</a></li>

獲取歌曲的id:<li><a href="/song/?id=(/d*?)" rel="external nofollow" rel="external nofollow" >.*?</a></li>

到此,我們整個過程已經分析完了,上代碼看具體細節~~

代碼如下:

#!/usr/bin/env python3# -*- coding: utf-8 -*-import reimport urllib.requestimport urllib.errorimport urllib.parseimport jsondef get_all_hotSong():  #獲取熱歌榜所有歌曲名稱和id url='http://music.163.com/discover/toplist?id=3778678' #網易云云音樂熱歌榜url html=urllib.request.urlopen(url).read().decode('utf8') #打開url html=str(html)  #轉換成str pat1=r'<ul class="f-hide"><li><a href="/song/?id=/d*?">.*</a></li></ul>' #進行第一次篩選的正則表達式 result=re.compile(pat1).findall(html)  #用正則表達式進行篩選 result=result[0]  #獲取tuple的第一個元素 pat2=r'<li><a href="/song/?id=/d*?">(.*?)</a></li>' #進行歌名篩選的正則表達式 pat3=r'<li><a href="/song/?id=(/d*?)">.*?</a></li>' #進行歌ID篩選的正則表達式 hot_song_name=re.compile(pat2).findall(result) #獲取所有熱門歌曲名稱 hot_song_id=re.compile(pat3).findall(result) #獲取所有熱門歌曲對應的Id return 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=' #歌評url header={ #請求頭部 '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={'params':'zC7fzWBKxxsm6TZ3PiRjd056g9iGHtbtc8vjTpBXshKIboaPnUyAXKze+KNi9QiEz/IieyRnZfNztp7yvTFyBXOlVQP/JdYNZw2+GRQDg7grOR2ZjroqoOU2z0TNhy+qDHKSV8ZXOnxUF93w3DA51ADDQHB0IngL+v6N8KthdVZeZBe0d3EsUFS8ZJltNRUJ','encSecKey':'4801507e42c326dfc6b50539395a4fe417594f7cf122cf3d061d1447372ba3aa804541a8ae3b3811c081eb0f2b71827850af59af411a10a1795f7a16a5189d163bc9f67b3d1907f5e6fac652f7ef66e5a1f12d6949be851fcf4f39a0c2379580a040dc53b306d5c807bf313cc0e8f39bf7d35de691c497cda1d436b808549acc'} postdata=urllib.parse.urlencode(data).encode('utf8') #進行編碼 request=urllib.request.Request(url,headers=header,data=postdata) reponse=urllib.request.urlopen(request).read().decode('utf8') json_dict=json.loads(reponse) #獲取json hot_commit=json_dict['hotComments'] #獲取json中的熱門評論 num=0 fhandle=open('./song_comments','a') #寫入文件 fhandle.write(hot_song_name+':'+'/n') for item in hot_commit:  num+=1  fhandle.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爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

對比一下網頁上《如果我愛你》這首歌的歌評和我們保存下的歌評:

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

python爬蟲抓取數據,python3網易云評論,python抓取網易云音樂

信息無誤~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 静海县| 山西省| 辽阳县| 乳山市| 扶绥县| 太康县| 灌南县| 竹北市| 镶黄旗| 宜宾市| 瓮安县| 安康市| 太原市| 梁平县| 建水县| 衡阳市| 富阳市| 乌鲁木齐县| 大埔区| 绥芬河市| 楚雄市| 寿阳县| 安岳县| 松原市| 青阳县| 镇安县| 波密县| 越西县| 凤山市| 临泽县| 太保市| 新田县| 本溪市| 揭西县| 吉林市| 岗巴县| 耿马| 汉寿县| 随州市| 宝兴县| 甘洛县|