# 導入requests網絡請求模塊
import requests
# 導入lxml標簽匹配模塊
from lxml import etree
# 導入re 正則匹配模塊
import re
#導入系統路徑模塊
import os
# 導入進程模塊
import multiprocessing
import threading
# 創建爬蟲類
class WangyiMusic(object):
#創建請求方法 參數為要爬取的網址
def data_content(self,url):
#發送request請求獲取網頁源碼 並加入請求頭
data = requests.get(url,headers={'User-Agent': 'Mozilla/5.0'})
#返回二進制數據
return data.content
#寫入文件方法 方便數據清洗
def With(self):
# 調用請求方法 傳入網址參數
res = self.data_content('https://music.163.com/discover/toplist?id=3778678')
# 獲取源碼轉車utf-8編碼類型 因為網易雲音樂為utf-8
res = res.decode('utf-8')
# 寫入文件 open打開文件 第一個參數為路徑和文件名 第二個參數為寫入權限 第三個參數再次聲明編碼urt-8 as其別名
with open('./index.html','w',encoding='utf-8') as f:
# 寫入
f.write(res)
# 數據清洗
def Re(self):
# 讀取數據 第一個參數為路徑和文件名 第二個參數為讀取權限 第三個參數再次聲明編碼urt-8 as其別名
with open('./index.html','r',encoding='utf-8') as f:
# 遍歷接收讀取數據
html = f.read()
#正則匹配想要的數據
res = re.findall('<li><a href="/song\?id=(.+?)">(.+?)</a></li>',html)
#定義列表用於存儲url
my_list = []
#定義列表用於存儲歌曲名稱
my_list_name = []
for i in res:
#因為網易雲音樂的音樂源在 http://music.163.com/song/media/outer/url?id=歌曲id 內所以我們只要獲取id即可 這里是拼接歌曲源網址
my_list.append("http://music.163.com/song/media/outer/url?id="+i[0]+".mp3")
#取歌曲名加入列表
my_list_name.append(i[1])
# 返回參數
return my_list,my_list_name
#爬取音樂方法
def XiaZai(self, url, name):
# 調用方法發送請求 接收返回數據
data = self.data_content(url)
# 寫入文件 open打開文件 第一個參數為路徑和文件名 第二個參數為寫入權限二級制數據 第三個參數再次聲明編碼urt-8 as其別名
with open('E:/網易雲top200/'+name+'.mp3','wb') as f:
#寫入
f.write(data)
#程序入庫
if __name__ == '__main__':
# 實例化對象
wang = WangyiMusic()
# 調用爬取網址頁面並寫入文件方法
wang.With()
# 調用數據清洗方法 接收參數
url_list,name_list = wang.Re()
# 循環 次數為音樂網址的個數
for i in range(len(url_list)):
# 調用線程 給予方法 給予參數
t = threading.Thread(target=wang.XiaZai,args=(url_list[i],name_list[i]))
#啟動線程
t.start()
#守護子線程 讓主線程等待所以子線程完成后在結束
t.join()
參考網址 https://www.jianshu.com/p/8e568a83675d