爬蟲(chóng)實(shí)戰(zhàn)!Python多線程爬取網(wǎng)易云熱歌音樂(lè)
多線程爬取網(wǎng)易云熱歌音樂(lè)
前言
學(xué)習(xí)了螞蟻老師的《零基礎(chǔ)學(xué)Python簡(jiǎn)單爬蟲(chóng)》后我進(jìn)步很大,開(kāi)始自己實(shí)踐爬取酷狗音樂(lè),網(wǎng)易云音樂(lè)等各大音樂(lè)網(wǎng)站。在我成功的爬取了網(wǎng)易云熱歌榜所有音樂(lè)后,我開(kāi)始思考如何才能更快的爬取數(shù)據(jù)。螞蟻老師的《python并發(fā)編程,用多線程加速程序運(yùn)行》課程解決了我的問(wèn)題,現(xiàn)在爬取速度快了十倍!??!
1.網(wǎng)站分析
首先大家打開(kāi)網(wǎng)易云網(wǎng)站的主頁(yè),然后點(diǎn)擊排行榜,再點(diǎn)擊云音樂(lè)特色榜中的熱歌榜。(https://music.163.com/#/discover/toplist?id=3778678)大家按F12進(jìn)入開(kāi)發(fā)者模式,用開(kāi)發(fā)者工具搜索《孤勇者》,點(diǎn)擊搜索結(jié)果找到網(wǎng)頁(yè)源代碼中的歌曲ID和歌曲名稱。
2.導(dǎo)入python庫(kù)
import?os
import?requests
import?re
import?threading
3.發(fā)送網(wǎng)絡(luò)請(qǐng)求,訪問(wèn)網(wǎng)站
#網(wǎng)易云網(wǎng)址,以熱歌榜單鏈接為例
url?=?"https://music.163.com/discover/toplist?id=3779629"??
headers?=?{
????????????'Cookie':'_iuqxldmzr_=32;?_ntes_nnid=ae3b5b26314cae4ba35657b357d06348,1640060772701;?_ntes_nuid=ae3b5b26314cae4ba35657b357d06348;?NMTID=00OFTzvJD26ltfT4kPLk7b6nPCn51oAAAF92z1lmg;?WNMCID=xyhddx.1640060773918.01.0;?WEVNSM=1.0.0;?WM_TID=i2DIsKQNGhZAUABUFBIq86abC%2BMqTYA3;?JSESSIONID-WYYY=w0%5CqDCxwTCSuV6TSo71m4xqKq7x9%2F%2FhSWX04%5Ce%5CEREabbI%5CDvvCOFCt6GMD9UUeC2tamR6NwUGM9X9h%2Bmugrqq5u92NSN2hoycyrjb5ldDxE8cPwGcey7bDQvNynG6230m3Saux4JblnRBF%2BchXEp7%2FRNT96%5CHUEk%5CG3geohb6jo6q5p%3A1645762943177;?WM_NI=PH%2BSXDfhBlYnm2%2BWub53aGvl0VFZ%2BjlmccwSVtT5KsJUNj33VSMU7BuSHREMe3IPpsTymGnW7W3G4xmYipYo786C8z5c2UE8Mpsu8vBVsbVBmnkWmD69VHJ2XXacu5rNZG8%3D;?WM_NIKE=9ca17ae2e6ffcda170e2e6eea8eb3abae9979bf37b98b48fa6d85a879f9aaff821a9b2e5b3d8749bbfc0d7ce2af0fea7c3b92a9498e5b4db50a6b88e8ddc66afeee5b8f86af7edafa8f568f48a8abbaa62b0b3ad84f65996ac9cd6ca798a8b828bb239968d83b6b64ab78d88b3c847a7ed87b1f37998a7a3a8ed5df589fda8b774af87a791dc65f5e8faa4bb72f7bdfeb6c8348fb0bd96bb7e828abd83d54aafb2a5b8f050f6e79aa9c93a9c88af84f83fb29296a8bb37e2a3',
????????????'Referer':'https://music.163.com/',
????????????'User-Agent':'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/98.0.4758.102?Safari/537.36',
????????????}
r?=?requests.get(url)
4.解析歌曲ID、歌名
正則匹配網(wǎng)易云歌曲ID、歌曲名字
#孤勇者
zip_data?=?re.findall('(.*?) ',r.text)
print(zip_data)?????#打印查看
上圖我們可以看到,zip_data是一個(gè)大列表,其中每個(gè)元素都是一個(gè)元組,每個(gè)元組包含了歌曲ID和歌名。
5.爬取音樂(lè)函數(shù)
def?craw(music_url,music_name):
????music_data?=?requests.get(music_url,?timeout=30).content
????#新建一個(gè)music文件夾
????if?not?os.path.exists('./music'):
????????os.mkdir('./music')
????#保存數(shù)據(jù)
????with?open(f"./music/{music_name}.mp3",?'wb')?as?f:
????????f.write(music_data)
6.創(chuàng)建多線程,準(zhǔn)備批量爬取
threads?=?[]
for?data?in?zip_data:
????music_id?=?data[0]
????music_name?=?data[1]
????print(music_name)
????music_url?=?"http://music.163.com/song/media/outer/url?id="?+?music_id
????print(music_url)
????threads.append(threading.Thread(target?=?craw,args?=?(music_url,music_name)))
music_url由一個(gè)音樂(lè)下載接口和音樂(lè)ID拼接而成。我們可以打印出待爬取的url和歌名如下圖所示
7.啟動(dòng)多線程
for?thread?in?threads:
????thread.start()???????
8.等待結(jié)束
for?thread?in?threads:
????thread.join()????????
下載好熱歌榜所有的音樂(lè)之后,大家可以快樂(lè)的一邊聽(tīng)音樂(lè),一邊敲代碼了,哈哈哈~
推薦螞蟻老師的全套Python課程
先保存圖片,然后抖音打開(kāi)掃碼購(gòu)買(mǎi),提供代碼、課件、答疑服務(wù)

