多線程爬取網易雲音樂熱歌榜 200首音樂


# 導入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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM