網易雲音樂評論&評論者信息爬取
-----老中醫不看病
<太陽底下沒有新鮮事>
歌曲:《都是夜歸人》 歌手:許靜美
作曲:陳佳明 作詞:陳佳明
時長:05:00 評論數:10452
爬取原因:極限挑戰第四季第十期插曲,好聽。
Step 1 評論&評論者信息爬取及存儲
1) 分析網頁(URL==https://music.163.com/#/song?id=306967):
查找「XHR」——>找到「R_SO_4_306967?.......」——>「Headers」中,拉到最後,找到「Form Data」,顯示如下:
發現信息異常,猜測應該是加密了。
採用文章https://blog.csdn.net/cy776719526/article/details/80277294中的方法,
進行網址拼接,
http://music.163.com/api/v1/resource/comments/R_SO_4_306967?limit=20&offset=0,
其中「limit=」後的數字為每個網址顯示評論數;「offset=」後的數字為評論偏移量,從0開始,每次增加量與「limit=」後的數字相同。
需要爬取的內容都在json里,如下:
裡面包含評論內容(content)、點贊數(likedcount)、評論時間(time)、評論者名字(nickname)、評論者數字ID(userId)等等,如下:
通過評論者數字ID,構造評論者網址(https://music.163.com/user/home?id=27949788),(注意一定要去掉中間的#號,要不然源網頁沒有要摘取的信息)。評論者源網頁包含動態數、關注數、粉絲數、所在地區、累積聽歌數等等,如下:
2) 資料庫欄位設置
(注意:評論存在emoji表情,佔四個位元組,需要設置為utf8mb4)
3) 爬蟲程序
from bs4 import BeautifulSoupimport pymysqlimport requestsimport jsonfrom multiprocessing import Poolimport datetime#連接資料庫connect = pymysql.connect( user=root, password=, host=127.0.0.1, db=test, port=3306, charset=(utf8mb4), use_unicode=True )cursor = connect.cursor()#信息爬取def get_info(i): i *= 20 header = { User-Agent: 填寫自己瀏覽器內容, Cookie:填寫自己瀏覽器內容} url = http://music.163.com/api/v1/resource/comments/R_SO_4_306967?limit=20&offset=%s % i request = requests.Session() request.keep_alive = False response = request.get(url=url, headers=header, timeout=10) result = json.loads(response.text) for j in range(20): userID = result[comments][j][user][userId] name = result[comments][j][user][nickname] comment = result[comments][j][content].replace(
, ) like_count = result[comments][j][likedCount] time = int(str(result[comments][j][time])[:-3]) dateArray = datetime.datetime.utcfromtimestamp(time) time = dateArray.strftime("%Y-%m-%d %H:%M:%S") URL = https://music.163.com/user/home?id=%s % userID html = requests.get(url=URL, headers=header).text Soup = BeautifulSoup(html, lxml) event_count = int(Soup.find_all(strong,id=event_count)[0].string) follow_count = int(Soup.find_all(strong, id=follow_count)[0].string) fan_count = int(Soup.find_all(strong,id=fan_count)[0].string) location = Soup.find_all(div, class_=inf s-fc3)[0].get_text().replace(所在地區:, ).replace(年齡:, ).replace(
, ).replace(xa0, ) listening_songs_num = int(Soup.find_all(h4)[0].string.replace(累積聽歌, ).replace(首, )) data = {userID: userID, name: name, comment: comment, like_count: like_count, time: time, event_count: event_count, follow_count: follow_count, fan_count: fan_count, location: location, listening_songs_num: listening_songs_num} print(data) cursor.execute(insert into doushiyeguiren(userID, name, comment, like_count, time, event_count, follow_count, fan_count, location, listening_songs_num) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s),[data[userID], data[name], data[comment], data[like_count], data[time], data[event_count], data[follow_count], data[fan_count], data[location], data[listening_songs_num]]) # 提交數據 connect.commit()if __name__ == __main__: pool = Pool(20) # 創建進程池 pool.map(get_info, [i for i in range(522)]) connect.close()
4) 資料庫數據
Step 2 數據分析
1) 詞雲(高頻辭彙)
2) 評論數變化
3) 評論者動態數量
4) 評論者粉絲數量
5) 評論者關注數量
6) 評論點贊數分布
7) 評論者聽歌數
8) 評論者地域分布
9) 浙江區域評論者分布
10) 點贊數TOP10
恭喜「網易UFO丁磊」同誌喜獲點贊數TOP1。現在動動手指,你就是三石同志的第10萬個粉絲。。。。。。(除了第二名,其它都在熱評里,我也不清楚為什麼點贊數第二的這位沒有進熱評,大概這就是命。。。。。。)
推薦閱讀:
※網易雲音樂「周杰倫事件」刷屏,版權問題還是互聯網公司「命脈」
※RADWIMPS|就是這該死的執著,讓我放不下你
※2分鐘告訴你如何在網易雲音樂正常聽周杰倫的歌
※今日歌單 | 越美麗的東西我越不可碰