整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Python怎么用Selenium爬取Q音樂歌曲+評

          Python怎么用Selenium爬取Q音樂歌曲+評論信息?

          薦學習

          • 金三即過,這300道python高頻面試都沒刷,銀四怎么闖?

          本文對使用到的技術僅做簡單的介紹,若想了解更多,請前往相應的官網網站進行學習。
          本文適合對爬蟲相關知識接觸不多的新手,主要是普及Selenium如何做爬蟲,大佬請跳過。

          01 Selenium簡單介紹

          1.1.簡介

          • Selenium是一個用于測試網站的自動化測試工具,支持各種主流界面瀏覽器。
          • 簡而言之,Selenium是一個用來做網站自動化測試的庫,它的定位是做自動化測試的。我們也可以利用它來做爬蟲,獲取一些網頁信息,并且這種爬蟲是模擬真實瀏覽器操作的,實用性更強。
          • Selenium是市面上唯一一款可以與付費產品競爭的自動化測試工具。
          • 如果想了解更多,可以前往Selenium中文網學習

          1.2.安裝

          • 要使用Selenium首先要在python中安裝相關的庫:
          pip install Selenium
          • 安裝相應瀏覽器的webdricer驅動文件,這里提供chrome的鏈接,其它瀏覽器網上搜一搜就有。選擇合適的版本,我選擇的是2.23。
          • 下載解壓后得到exe文件,將這個文件拷貝到chrom的安裝文件夾下:
          • 一般是C:\Program Files (x86)\Google\Chrome\Application,或者是C:\Program Files\Google\Chrome\Application。

          • 然后將該路徑配置到環境變量中:

          • 最后到寫段代碼測試一下:
          from selenium import webdriver
          driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")

          如果看到開啟了一個瀏覽器窗口就是成功了,否則下面會有相應的報錯信息,需要檢查前面的步驟。

          1.3.簡單使用介紹

          1.元素定位方式:

          • 基本上前幾種方式就能夠獲取到需要的元素,需要自己辨別結果是否唯一來選擇相應的選擇器。
          • 通過drive對象調用此方法,返回的是標簽對象,或者是標簽對象的列表,可以通過.text獲取該標簽下的文字,可以通過get_attribute()獲取標簽的其它屬性值。

          分享快速定位元素的小妙招:看所需信息所在的標簽的id,class,name的名稱是否與標簽下信息的語義有關,一般有關的都代表是唯一的。(從開發者的角度去思考)若無法通過當前標簽唯一定位,則考慮父級標簽,一次類推,總是能找到定位的方法的。

          2.鼠標事件(模擬鼠標操作)

          • 通過標簽對象調用即可。

          3.鍵盤事件(模擬鍵盤操作)

          4.其他操作

          • 其他操作包括控制瀏覽器的操作,獲取斷言信息,表單切換,多窗口切換,警告框處理,下拉框處理,文件上傳操作,cookie操作,調用js代碼,截圖,關閉瀏覽器等操作,因為在這里用的不多,就沒有一一羅列,自行去官網學習。

          02 爬取目標

          • 這個實戰爬蟲主要完成以下目標:
          • 爬取QQ音樂官網指定歌手的前5首歌曲的基本信息和前五百條熱門評論。

          2.1 獲取前五歌曲的url

          • 分析該頁面的代碼得知,包裹所有歌曲信息的標簽的class是唯一的,我們可以獲取到它,再遍歷所有子標簽,也可以一次得到所有包裹歌曲信息的div,再獲取里面的a標簽。

          2.2 獲取歌曲基本信息

          • 可以看到基本信息標簽里的class名稱是有一部分帶語義的,那么通過css選擇器肯定可以唯一確定下來。

          2.3 獲取歌詞

          • 頁面上的歌詞不完整,似乎需要點擊展開才行,但其實所有歌詞已經在標簽里面了,只是顯示的問題了。

          2.4 獲取前五百條評論消息

          • 我們可以看到熱門評論一次是十五條,下面有一個點擊加載更多鏈接,點了之后會多出15條。
          • 我們需要模擬點擊33次,獲得510條評論

          2.5 寫入CSV文件

          使用csv庫,將爬取到的數據寫入到csv文件中進行持久化。

          2.6 實現代碼

          from selenium import webdriver
          import csv
          from time import sleep
          import time
          #
          #  Author : ATFWUS
          #  Date : 2021-03-21 20:00
          #  Version : 1.0
          #  爬取周杰倫最熱門五首歌曲的基本信息,歌詞,前五百條熱門評論
          #  此代碼僅供交流學習使用
          #
          #1.創建Chrome瀏覽器對象,這會在電腦上在打開一個瀏覽器窗口
          driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
          #2.打開QQ音樂 -周杰倫頁面
          driver.get("https://y.qq.com/n/yqq/singer/0025NhlN2yWrP4.html")
          #3.配置
          csv_file=open('songs.csv','w',newline='',encoding='utf-8')
          writer=csv.writer(csv_file)
          start=time.time()
          # 取前5首歌曲
          song_numer=5
          song_url_list=[]
          song_resourses=[]
          songlist__item=driver.find_elements_by_class_name("songlist__item")
          # 獲取所有歌曲url
          for song in songlist__item:
              song__url=song.find_element_by_class_name("js_song").get_attribute("href")
              song_url_list.append(song__url)
              song_numer-=1
              if(song_numer==0):
                  break
          # print(song_url_list)
          print("已獲取周杰倫熱門歌曲列表前五首的url")
          print()
          # 獲取一首歌曲所需要的信息
          def getSongResourse(url):
              song_resourse={}
              driver.get(url)
              # 這個0.5秒用于等待異步請求的完成
              sleep(0.8)
              # 獲取歌曲名
              song_name=driver.find_element_by_class_name("data__name_txt").text
              print("開始獲取歌曲《"+song_name+"》的基本信息")
              # 獲取流派,發行時間,評論數
              song_liupai=driver.find_element_by_css_selector(".js_genre").text[3:]
              song_time=driver.find_element_by_css_selector(".js_public_time").text[5:]
              song_comment_num=driver.find_element_by_css_selector(".js_into_comment").text[3:-1]
              print("歌曲《" + song_name + "》基本信息獲取完畢")
              print("開始獲取歌曲《" + song_name + "》的歌詞")
              # 點擊展開歌詞
              driver.find_element_by_partial_link_text("[展開]").click()
              sleep(0.3)
              lyic=""
              # 獲取拼接歌詞
              lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")
              for l in lyic_box:
                  if l.text!="":
                      lyic+=l.text+"\n"
              print("歌曲《" + song_name + "》的歌詞獲取完畢")
              print("開始獲取歌曲《" + song_name + "》的第1-15條熱門評論")
              # 獲取500條評論
              comments=[]
              # 點擊加載更多29次,每次多出15條評論
              for i in range(33):
                  driver.find_element_by_partial_link_text("點擊加載更多").click()
                  print("開始獲取歌曲《" + song_name + "》的第"+str((i+1)*15+1)+"-"+str((i+2)*15)+"條熱門評論")
                  sleep(0.5)
              comments_list=driver.find_element_by_css_selector(".js_hot_list").find_elements_by_tag_name("li")
              for com in comments_list:
                  content=com.find_element_by_css_selector(".js_hot_text").text
                  content_time=com.find_element_by_css_selector(".comment__date").text
                  zan_num=com.find_element_by_class_name("js_praise_num").text
                  comment={}
                  comment.update({"評論內容":content})
                  comment.update({"評論時間":content_time})
                  comment.update({"評論點贊次數":zan_num})
                  comments.append(comment)
              print("歌曲《" + song_name + "》的前五百條熱門評論獲取完畢")
              print("歌曲《"+song_name+"》所有信息獲取完畢")
              print()
              song_resourse.update({"歌曲名":song_name})
              song_resourse.update({"流派":song_liupai})
              song_resourse.update({"發行時間":song_time})
              song_resourse.update({"評論數":song_comment_num})
              song_resourse.update({"歌詞":lyic})
              song_resourse.update({"500條精彩評論":comments})
              return song_resourse
          for song_page in song_url_list:
              song_resourses.append(getSongResourse(song_page))
              # break
          print("正在寫入CSV文件...")
          for i in song_resourses:
              writer.writerow([i["歌曲名"],i["流派"],i["發行時間"],i["評論數"],i["歌詞"]])
              for j in i["500條精彩評論"]:
                  writer.writerow([j["評論內容"],j["評論時間"],j["評論點贊次數"]])
              writer.writerow([])
          csv_file.close()
          end=time.time()
          print("爬取完成,總耗時"+str(end-start)+"秒")

          2.7 代碼注意事項

          • 注意在驅動對象get請求網頁之后,要sleep一段時間,這段時間是網站用來進行ajax請求獲取所需數據的,如果不sleep,那么你獲取的數據很有可能是空的,或者是默認值。
          • 整個爬下來大概10分鐘的樣子,我已經將進度輸出,不要提前關閉,因為我是最后才寫入csv文件的, 提前關閉csv文件里什么也沒有。
          • QQ音樂最近有個bug,就是點擊去獲取更多后,新增的15條評論還是最初的,可能也是網的原因,代碼那里應該沒有問題的。
          • 這個代碼主要用于爬取主要數據,很多模擬操作可能不完善。

          2.8 使用Padas庫簡單的計算數據

          • 有關Padas庫的使用,它的兩種數據結構,請查看官網,這里不做說明。
          • 先讀取csv文件中的數據到內存中,再進行操作。
          • 需要先安裝padas庫:
          pip install padas
          import pandas as pd
          import csv
          # 這五個列表用于創建Series
          se=[]
          names=[]
          # 先讀取CSV文件的內容至內存中
          with open("songs.csv",'r',encoding="utf8") as f:
              # 創建閱讀器對象
              reader=csv.reader(f)
              rows=[row for row in reader]
              index=0
              print("開始解析CSV數據...")
              for i in range(5):
                  s1=[]
                  # 讀取第一行信息
                  names.append(rows[index].__str__().split(',')[0][2:-1])
                  index+=1
                  # 讀取五百條評論的點贊消息
                  for j in range(510):
                      s1.append(int(rows[index].__str__().split(',')[2][2:-2]))
                      index+=1
                  se.append(s1)
                  # 讀取掉空行
                  index+=1
              print("CSV數據解析成功\n")
          
          # 創建的5個series
          for i in range(5):
              series=pd.Series(se[i])
              print("歌曲《"+names[i]+"》的平均點贊次數是:" + str(series.mean()))
              print("歌曲《" + names[i] + "》的標準差是:" + str(series.std()))
              print()

          2.9 大致結果截圖

          感嘆:爬下幾千條評論,看了之后,發現,有傷感那味了,哈哈哈

          作者:ATFWUS

          原文鏈接:https://blog.csdn.net/ATFWUS/article/details/115053245

          頻、視頻的格式

          開始學習之前,我們要下載些素材用來測試使用,地址如下:https://pan.baidu.com/s/1reRWno0ibYRcYXjw4MClqw

          提取碼:td80

          其中包括兩個視頻一個音頻和一個安裝程序。

          學習如何在頁面中添加音頻、視頻之前應該了解一點基礎知識。

          我們應該都有在互聯網上下載電影、視頻、音樂的經歷,大家會注意到,有的視頻文件名的后綴是.avi,有的視頻是.mp4,還有.mov的,據不完全統計,常見的各種視頻格式有十幾種之多。

          常見的音頻的格式比起視頻來會顯得少一些,一般是.wav和.mp3格式。

          為什么存儲相同的內容可以有這么多不同的格式呢?

          格式產生的核心在于對音頻、視頻等多媒體文件進行的不同編碼方式。

          那什么是編碼呢?

          簡單來說我們可以把"編碼"這個詞分成兩個部分,第一個是"編",也就是"整理、組織"的意思,第二個是"碼",也就是我們平時所說的"數碼"。

          首先說"碼",我們的計算機中的數據最終都是通過二進制的數字(0和1)來存儲或計算的,這些0或1就是數碼。無論代碼、程序、圖片、音樂、視頻、文字等的存儲與計算都不例外。不管多么復雜或簡單的文件,在計算機看來,都是一大堆0和1。

          一個0或1被稱為1比特,圖片或視頻中的一個黑白像素通常是8比特(八位),如果一張1080乘720個像素的圖片所占內存的大小就是1080*720*8=6220800字節,約等于0,74mb。如果一個視頻每秒中有25幀,也就是一秒鐘在我們眼前閃過25張圖片(視頻播放實際上就是在我們眼前快速的更替圖片,這些圖片在大腦中會被自動連成動作,這也是小的時候在課本的角上畫好一套走路的小人的不同動作后,快速翻動書頁,畫面中的小人會走路的原因,大家可以自行百度"視覺暫留原理")。

          一秒鐘25張1080乘720的圖片的視頻,一秒鐘就會占0.74*25=18.5mb的內存。如果是一分鐘呢,18.5*60=1110mb約等于1.08gb。這樣的數據量是不是很嚇人。

          但事實上我們下載的1080*720的一小時三十分鐘左右的視頻的體積往往也沒有超過1gb,這又是為什么呢?

          這就是"編"的功勞!對數碼進行整理和組織的主要目的是壓縮體積,壓縮數據體積既能節省磁盤又能方便傳播與攜帶,是信息技術的關鍵技術之一,壓縮的方法一般有兩類,一類叫做無損壓縮,也就是通過對這一大堆數碼進行一個特殊的組合使其占有更小的空間,一類叫做有損壓縮,是在無損壓縮的基礎上剔除掉人眼睛識別不到的冗余信息。具體的壓縮過程涉及到很多數學知識,這里大家簡單了解一下即可。

          壓縮后的視頻或音頻文件最終通過播放器對該文件的壓縮算法進行逆向運算后,還原成計算機可以解讀的畫面和聲音再呈現給觀眾,這個過程叫做"解碼"。

          通過"編"的方式壓縮文件體積,通過"解"的方式再還原出文件內容成了處理大規模數據的通用手法。

          不同的編碼和解碼方式催生出不同的文件格式,這種情況下,瀏覽器在播放視頻的時候就要有應對不同格式的不同解碼方式,在15年以前,瀏覽器為了能夠播放不同格式的視頻,就要調用電腦中不同的播放器,這個過程的寫法非常麻煩。隨著技術不斷地整合,時至今日,在頁面中播放視頻不需要這么復雜的寫法了,但是因為每個瀏覽器都不是包打一切,因此,雖然不用指定播放器,但是也要預設不同格式的視頻來應對不同的瀏覽器。

          因此,我們在這一部分的學習中除了講解如何向頁面添加不同格式的音視頻外還會告訴大家如何為音視頻轉換格式。

          為頁面添加音頻、視頻

          添加音頻使用<audio></audio>標簽,這個標簽被所有瀏覽器支持,是html5推薦的音頻導入標簽,但是遺憾的是在html4標準中是不被支持的或者說是非法的。

          這里給大家簡要介紹一下html5和html4的區別。

          簡單來說呢,一個html文件的第一條語句是<!DOCTYPE HTML>,它就是HTML5標準的文件。如果是html4,它的第一條聲明語句有三種寫法,像這樣

          一:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

          二:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

          三:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

          版權聲明:本文為CSDN博主「痦子」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。

          原文鏈接:https://blog.csdn.net/yh1061632045/article/details/81518141

          這讓我想到了孔乙己的"茴"字的多種寫法

          是不是很麻煩,其實html5比html4更簡單,功能更強大,而且我們一直以html5的標準進行學習,所以大家不必糾結。

          下面我們導入一個音頻試試吧。示例代碼如下:

          <!DOCTYPE HTML>
            <html>
            <head> 
            <title>音視頻導入</title>
            </head> 
            <body>
            <audio controls="controls"> 
              <source src="audio/千年的祈禱.mp3" type="audio/mp3" />
            </audio>
            </body> 
            </html>

          頁面效果如下:

          其中controls屬性就是用來顯示播放控制界面的,就是這個:(偷懶的話可以寫成"controls"就ok,不必加"="以及后面的內容了。)

          如果以后您使用自己編寫的控制界面,就可以不添加這個屬性。

          刪掉這個屬性后就是這樣:這樣為自定義的播放控制界面留出了位置。

          <audio></audio>標簽夾著<source>標簽,一個<audio></audio>標簽中可以添加多個<source>用以支持不同的格式要求。示例代碼如下:(這段代碼來自w3school)

          <audio controls="controls"> 
            <source src="song.ogg" type="audio/ogg" /> 
            <source src="song.mp3" type="audio/mpeg" />
            Your browser does not support the audio element.<!--你的瀏覽器不支持這個音頻元素-->
          </audio>

          type屬性是告訴瀏覽器音樂文件的類型。

          不同格式的文件的生成需要我們自己去做,這就涉及到如何給一個音頻文件進行格式轉化的問題。這個問題我們明天再說,今天先學習為頁面添加音頻和視頻。

          下面我們來看一下視頻的導入方法,示例代碼如下:

          <video controls> 
            <source src="video/阿塔麗.mp4" type="video/mp4" />
          </video>

          頁面效果如下:

          我們可以通過設置height和width屬性來控制視頻的面積。實例代碼如下:

          <video controls width="850" height="500" > 
            <source src="video/阿塔麗.mp4" type="video/mp4" />
          </video>

          頁面效果如下:

          視頻畫面變小了,和視頻并排的是我們之前添加的音頻文件,由此可知,這兩個元素都是內聯元素。

          今天的內容結束了,明天我們繼續學習格式轉換和為不同瀏覽器預設不同音視頻格式的方法。

          如果您有任何疑問請給我留言,如有問題或錯誤請予以斧正!

          HTML完整學習目錄

          HTML序章(學習目的、對象、基本概念)——零基礎自學網頁制作

          HTML是什么?——零基礎自學網頁制作

          第一個HTML頁面如何寫?——零基礎自學網頁制作

          HTML頁面中head標簽有啥用?——零基礎自學網頁制作

          初識meta標簽與SEO——零基礎自學網頁制作

          HTML中的元素使用方法1——零基礎自學網頁制作

          HTML中的元素使用方法2——零基礎自學網頁制作

          HTML元素中的屬性1——零基礎自學網頁制作

          HTML元素中的屬性2(路徑詳解)——零基礎自學網頁制作

          使用HTML添加表格1(基本元素)——零基礎自學網頁制作

          使用HTML添加表格2(表格頭部與腳部)——零基礎自學網頁制作

          使用HTML添加表格3(間距與顏色)——零基礎自學網頁制作

          使用HTML添加表格4(行顏色與表格嵌套)——零基礎自學網頁制作

          16進制顏色表示與RGB色彩模型——零基礎自學網頁制作

          HTML中的塊級元素與內聯元素——零基礎自學網頁制作

          初識HTML中的<div>塊元素——零基礎自學網頁制作

          在HTML頁面中嵌入其他頁面的方法——零基礎自學網頁制作

          封閉在家學網頁制作!為頁面嵌入PDF文件——零基礎自學網頁制作

          HTML表單元素初識1——零基礎自學網頁制作

          HTML表單元素初識2——零基礎自學網頁制作

          HTML表單3(下拉列表、多行文字輸入)——零基礎自學網頁制作

          HTML表單4(form的action、method屬性)——零基礎自學網頁制作

          HTML列表制作講解——零基礎自學網頁制作

          為HTML頁面添加視頻、音頻的方法——零基礎自學網頁制作

          音視頻格式轉換神器與html視頻元素加字幕——零基礎自學網頁制作

          HTML中使用<a>標簽實現文本內鏈接——零基礎自學網頁制作

          狗音樂是一款非常不錯的軟件,包含著音樂軟件所有該有的功能。

          初中開始接觸上網,下載歌曲便一直用酷狗音樂。想當初自己年少無知啊,好不容易湊夠5塊錢上了2個小時的網,結果愣是一首歌沒下載下來,下載的全是歌詞文件!我興高采烈地往自己的mp4里傳輸,結果發現不能播放!網吧時間到了,口袋錢空了,歌沒下下來,當時氣死老子了。這也可以說是一段難忘的經歷啊。

          上了大學以后,為了配合我稍微有一點那么文縐縐的氣質,開始跟隨網易大軍,使用網易云音樂,開啟我的高逼格歷程!大學畢業,氣質全無,我覺得我配不上網易云了,又投入了酷狗音樂的懷抱[笑哭]。

          這不,這兩天重看《雙世寵妃2》,再一次深深地迷上了里面的曲檀兒(梁潔飾演)【花癡】,配合葉炫清的《歸去來兮》,簡直了!【好像屌絲本質一覽無余?才不是,是欣賞!哈哈】

          開始分析:

          MV鏈接:https://www.kugou.com/mvweb/html/mv_866733.html

          想直接看的,可跳轉過去哦!

          第一步:打開酷狗WEB,搜索《歸去來兮》,點擊

          第二步:點擊音樂播放界面的mv,進行跳轉到播放頁面。

          簡直了,美美美

          哈哈,別忘了正事!

          第三步:右鍵(Chrome)檢查,Ctrl+F搜索"歸去來兮",結果如下:

          可以看出,這里面有我們需要的MV的標題和MV的哈希值。至于哈希值是啥,待會再解釋。

          獲取到它們,方法如下:

          access_url="鏈接地址"
          # 移除SSL驗證時的警告
          urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
          response=requests.get(access_url, headers=headers, verify=False)
          html=response.text
          web_data=etree.HTML(html)
          datas=web_data.xpath('//script[@type="text/javascript"]')
          x=datas[1].xpath('./text()')[0].strip().split('.')[0].split(',')
          mv_hash=x[1].split('"')[1]
          mv_title=x[2].split('"')[1]
          print('MV哈希值:%s,MV標題:%s'%(mv_hash,mv_title))
          # 劃重點:獲取key
          key=kugou_hash(mv_hash)
          

          第四步?

          在開始第四步之前,先用網上的解釋來說明什么是哈希加密!

          轉載鏈接:https://www.liaoxuefeng.com/wiki/897692888725344/923057313018752
          

          Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。

          什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。

          舉個例子,你寫了一篇文章,內容是一個字符串'how to use python hashlib - by Michael',并附上這篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并發表為'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因為根據'how to use python hashlib - by Bob'計算出的摘要不同于原始文章的摘要。

          可見,摘要算法就是通過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是為了發現原始數據是否被人篡改過。

          摘要算法之所以能指出數據是否被篡改過,就是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始數據做一個bit的修改,都會導致計算出的摘要完全不同。

          好,接下來,第四步:用hash得到key!

          m=hashlib.md5() # 哈希 md5加密
          kugou_slat='kugoumvcloud' # 鹽
          m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+鹽
          key=m.hexdigest()
          return key # 返回key值
          

          第五步:刷新頁面,右鍵檢查,Network,搜索key,得到如下結果:

          可以看到,這里面就有我們想要的超清畫質的下載鏈接!

          第六步:既然找到了最后的下載鏈接,那下載自然就不在話在!開搞!

          download_url="http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key)
          hash_res=requests.get(download_url, headers=headers)
          hash_js=hash_res.json() # json格式
          try:
           play_url=hash_js['mvdata']['rq']['downurl']
           file_suffix=play_url.split('/')[-1].split('.')[-1]
           if play_url !="":
           print('1080P MV下載地址已找到,請稍候...')
           with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
           fp.write(requests.get(play_url).content)
           print('>>>1080P下載完成!!!')
          

          至此,我們想要的超清MV便可收入囊中!演示:

          最后,附上源碼:

          import requests
          import hashlib
          from lxml import etree
          import urllib3
          import winreg
          import os
          # mv保存地址
          def get_desktop():
           key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
           return winreg.QueryValueEx(key, "Desktop")[0]
          save_path_real=get_desktop()+'\\' + "酷狗音樂MTV" + "\\"
          headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
          AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
          print('>>>>>>>>>>>>酷狗MV下載程序開始<<<<<<<<<<<<<\n')
          print('>>>>>>>>>>>>示例URL:http://www.kugou.com/mvweb/html/mv_1138506.html<<<<<<<<<<<<<\n')
          # 獲取mv的hash和title
          def get_mv_name_hash(html, save_path_real):
           web_data=etree.HTML(html)
           datas=web_data.xpath('//script[@type="text/javascript"]')
           x=datas[1].xpath('./text()')[0].strip().split('.')[0].split(',')
           mv_hash=x[1].split('"')[1]
           mv_title=x[2].split('"')[1]
           print('MV哈希值:%s,MV標題:%s'%(mv_hash,mv_title))
           # 獲取key
           key=kugou_hash(mv_hash)
           # 下載MV
           download_mv(mv_title,mv_hash,key,save_path_real)
          # 哈希加密的教程鏈接,轉1:https://www.jianshu.com/p/cc2468b82e90
          # 哈希加密的教程鏈接,轉2:https://www.jianshu.com/p/cb77838c69db
          # 得到key
          # 傳入MV哈希值 返回KEY值
          def kugou_hash(mv_hash):
           m=hashlib.md5() # 哈希 md5加密
           # #song_hash_upper=mv_hash.upper()#大寫
           kugou_slat='kugoumvcloud' # 鹽
           m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+鹽
           key=m.hexdigest()
           return key # 返回key值
          # 下載
          def download_mv(mv_title,mv_hash,key,save_path_real):
           if not os.path.exists(save_path_real):
           os.mkdir(save_path_real)
           print("%s正在下載,請稍候..."%mv_title)
           download_url="http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key)
           hash_res=requests.get(download_url, headers=headers)
           hash_js=hash_res.json() # json格式
           try:
           play_url=hash_js['mvdata']['rq']['downurl']
           file_suffix=play_url.split('/')[-1].split('.')[-1]
           if play_url !="":
           print('1080P MV下載地址已找到,請稍候...')
           with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
           fp.write(requests.get(play_url).content)
           print('>>>1080P下載完成!!!')
           except:
           try:
           play_url=hash_js['mvdata']['sq']['downurl']
           file_suffix=play_url.split('/')[-1].split('.')[-1]
           if play_url !="":
           print('720P MV下載地址已找到,請稍候...')
           with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
           fp.write(requests.get(play_url).content)
           print('>>>720P下載完成!!!')
           except:
           try:
           play_url=hash_js['mvdata']['hd']['downurl']
           file_suffix=play_url.split('/')[-1].split('.')[-1]
           if play_url !="":
           print('540P MV下載地址已找到,請稍候...')
           with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
           fp.write(requests.get(play_url).content)
           print('>>>540P下載完成!!!')
           except:
           print('>>>無MV!')
          # 獲取html
          def get_html(url):
           access_url=url
           # 移除SSL驗證時的警告
           urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
           response=requests.get(access_url, headers=headers, verify=False)
           html=response.text
           # 獲取mv的hash和標題
           get_mv_name_hash(html, save_path_real)
          def main():
           # MV頁面鏈接
           url=input('>>>請輸入酷狗音樂MV播放頁URL地址:')
           get_html(url)
           continue_download=input('>>>是否繼續下載?輸入Y or N,其余字符不可用!\n\n')
           if continue_download=='Y' or continue_download=='y':
           main()
          # 啟動程序
          if __name__=='__main__':
           main()
          

          好了,今天的分享到此就結束了,有想交流的,請記得私信我哦!

          代碼也可以打包成exe文件,電腦安裝python也能下載,我已經打包好了,如果小伙伴有需要的,也記得私信我哦。


          主站蜘蛛池模板: 色窝窝免费一区二区三区 | 无码人妻久久一区二区三区| 国模精品视频一区二区三区| 亚洲中文字幕在线无码一区二区| 久久久一区二区三区| 国产激情精品一区二区三区| 国产激情无码一区二区三区| 久久精品综合一区二区三区| 久久精品国产亚洲一区二区三区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产精品熟女视频一区二区| 无码人妻aⅴ一区二区三区有奶水| 国产吧一区在线视频| 波多野结衣一区二区| 亚洲第一区二区快射影院| 中字幕一区二区三区乱码| 日本高清一区二区三区| 波多野结衣av高清一区二区三区| 四虎精品亚洲一区二区三区| 一区二区三区中文| 国产日韩一区二区三免费高清| 日韩内射美女人妻一区二区三区| 精品人妻AV一区二区三区 | 国内精品视频一区二区三区八戒| 怡红院美国分院一区二区| 午夜精品一区二区三区在线观看| 亚洲AⅤ无码一区二区三区在线| 亚洲无人区一区二区三区| 97精品一区二区视频在线观看 | 精品免费国产一区二区| 精品人妻少妇一区二区三区| 久久精品免费一区二区三区| 亚洲一区二区三区播放在线| 日韩三级一区二区三区| 99精品国产一区二区三区| 中文字幕在线一区二区在线| 免费精品一区二区三区在线观看 | 国产传媒一区二区三区呀| 手机看片一区二区| 91精品一区二区| 日韩一区二区三区视频|