1. 程式人生 > >簡單的網易雲音樂熱門評論爬蟲

簡單的網易雲音樂熱門評論爬蟲

新手練習 all pymongo code rmi success 技術 ftime 加密算

簡單的網易雲音樂熱門評論爬蟲

註:本文沒有什麽技術含量,就是一個普通的AJAX數據爬蟲,適合新手練習

目標:爬取網易雲音樂歌曲的熱門評論

分析:本次爬蟲不難,思路是請求和獲取數據,網易雲音樂的評論是通過AJAX的方式進行加載的,打開chrome進行分析就很容易分析出來,唯一難點是它的傳送數據是加密的,如果不知道加密的方法的話,就無法構造請求。

https://music.163.com/weapi/event/user/permission?csrf_token=

這個就是用瀏覽器打開網易雲音樂時,瀏覽器調用的API,這個API是要用到加密算法的,後面經過搜索,發現了一個更為簡單的API

https://music.163.com/api/v1/resource/comments/R_SO_4_<song_id>

這個API的請求不需要進行加密,可以直接獲取得到歌曲的評論,雖然返回的不是所有評論,但是這次的目標是獲取歌曲的熱門評論,返回的數據中包含有熱門評論,可以實現我們的目標,足夠了。

思路:思路和普通的爬蟲思路一樣,發送請求,獲取數據,分析數據,存取數據

環境:python3.6.3,MongoDB4.0.0

模塊:request,json,pymongo,time,re

代碼:

# -*-coding:utf-8-*-
# Author: AnswerW3I
# version:3.6.3
import requests
import json
import time
import pymongo
import re

class Spider(object):
    def __init__(self, song):
        self.song_id = song
        self.song_url = "https://music.163.com/api/v1/resource/comments/R_SO_4_" + self.song_id
        self.headers = {
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0‘,
    ‘Referer‘: ‘http://music.163.com‘
}
        self.client = pymongo.MongoClient(‘localhost‘, port=27017)
        self.db = self.client.test
        self.collection = self.db.hotComments
        self.session = requests.session()
        self.session = requests.get(self.song_url, headers=self.headers)
        self._save()

    def _get_comments(self, json_data):
        # get the json and find the hotcomments
        data = json.loads(json_data)
        for item in data.get("hotComments"):
            yield {
                ‘comment‘: item.get("content"),
                ‘likes‘: item.get("likedCount"),
                ‘user‘: item.get("user").get("nickname"),
                ‘date‘: self._get_time(str(item.get("time"))[:10])
            }

    def _get_time(self, timeStamp):
        timeArray = time.localtime(int(timeStamp))
        return time.strftime("%Y-%m-%d", timeArray)

    def _save(self):
        for hotComment in self._get_comments(self.session.text):
            self.collection.insert(hotComment)
        print("save successfully")



def main():
    song_url = input("Song_Url:")
    a = re.compile(‘id=\d+‘)
    song_id = a.findall(song_url)[0].replace(‘id=‘,‘‘)
    print(song_id)


if __name__ == "__main__":
    main()

運行效果:嘗試爬取周傑倫的《晴天》

技術分享圖片

技術分享圖片

總結:內容沒有什麽技術含量,和普通的爬蟲思路一樣,不過這個Demo是爬取單首歌曲的,如果爬取歌曲過多,可能要做個代理池防止IP被封。

簡單的網易雲音樂熱門評論爬蟲