python3 爬取網易雲音樂的熱評

前言

最近對網絡爬蟲有點感興趣, 就簡單的學習了一下python。, 並打算以爬取網易雲音樂熱評作爲一個小項目練習。

思路

爬蟲的思路其實很簡單, 就是像瀏覽器一樣發起一個請求, 獲取相應的數據, 然後對獲取的數據進行分析, 獲取到我們想要的數據。

本身也是第一次寫爬蟲, 不能擼起袖子就幹, 還是需要去看看別人的經驗。 所以, 我也看了幾篇爬取網易雲音樂的爬蟲, 鏈接。說白了就是跟着他們的博客寫的。 一下是步驟:

1, 獲取網易的url地址。

網易雲音樂的網頁使用iframe框架。其實一直以來我就很少使用irame, 爲此還特意的去重新學習了一下iframe。 通過審查元素, 發現iframe中的sre屬性是空的。 所以可以通過在網絡面板中找到對應的url地址。 並通過requests請求響應的數據。 通過獲取所有的<a src= 'song?id = '>這樣的標籤, 可以獲取當前歌單中所有歌曲id。 有了id, 就可以通過一個R_SO_4_id這個藉口獲取歌曲熱評的數據。不過這個接口是一個post請求, 需要攜帶兩個參數: params和encSecKey。 簡單起見, 所以我就直接複製了瀏覽器中的值直接傳入(可以獲取前面的15條熱評數據, 已經夠了)。 然後再通過requests發起post請求獲取相應的數據即可。

編碼

import requests
from bs4 import BeautifulSoup
import re

url2 = 'https://music.163.com/playlist?id=923652592' //這是歌單頁面的url地址, 可以通過分析網絡面板得出
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
r = requests.get(url2,  headers=headers)
r.encoding='utf-8'

html = r.text//請求得到的數據
soup = BeautifulSoup(html, 'html.parser', from_encoding='utf-8')//使用beautifulSoup庫, 將其變爲DOM對象(可以自行查閱)。

aArr = soup.find_all('a', href=re.compile(r'^/song\?id=\d+$'))
urls = []
for item in range(len(aArr)):
    urls.append(aArr[item]['href'])

def getUrl (id ):
	prefix = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_'+id
    return  prefix
 
commentText = ''//評論內容
for index in range(len(urls)):
    print(index)
    id = (urls[index][9:])
    params = 'fNDXL/y4L+MnF++tzYwlZJC8DZo0cPhba4qb9E9w4hIUhEGPMKbdNXTuYobnaLCPu+VBNOattWN/FYu6SQZJvqJDzYnW0fIRuNgfkT5bW7mlpCJEG9vQbMTpbK0lVcZriqcK51ciH2fZkydEDqfhAH9WV/ubBAX2agf1T8LQyw7R1z91FWqs/GlJZqejjX0hAzhlyCpyhWOxtV/JWDpiy1Z5HO5BKrTRowGZkdv3H4g='
    encSecKey = '9678000fea3661975ccb0f0ac79f5c37d3a739dd8ca87bfb637e04dbe578e8f4125a1484f776e1d972d7d98e48e37de6b454dc1dadb4931016d817c2e722792c0e6a857df8071fb97d4a4b5e1994ba9a2611835c4d7cf7c408bb2881e4185917b41c8294803b1d2634cc0cb01e0542cba4e7e6245057cbc2eab518b359ce0da0'
    data = {
        'params': params,
        'encSecKey': encSecKey
    } 
    lr = requests.post(getUrl(id), data = data,  headers=headers)
    commentText = commentText + '\n\n' + lr.text
    
fs = open('./comment.json', 'w', encoding='utf-8')//寫入文件中
fs.write(commentText)
fs.close()

結尾

感覺爬蟲還是應該使用python寫,更簡單。 我最熟悉的本是js。 但是js是異步的。 想一同步的方式寫, 稍微有點麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章