1. 程式人生 > >Python爬蟲——百度+新浪微盤下載歌曲

Python爬蟲——百度+新浪微盤下載歌曲

  本篇分享將講解如何利用Python爬蟲在百度上下載新浪微盤裡自己想要的歌手的歌曲,隨便你喜歡的歌手!
  首先我們先探索一下我們操作的步驟(以下載Westlife的歌曲為例):開啟百度,輸入”Westlife 微盤”,將彈出如下頁面:
  百度Westlife
  第1,2條是新浪微盤的搜尋記錄,但第1條記錄中的歌曲大於1首,我們將不對其進行下載,下載的網頁類似於一下頁面:
  新浪微盤 一首歌
  接下來點選該頁面的下載按鈕即可下載,等待一會兒關閉當前網頁回到原所搜頁面,再對下一條記錄進行處理。我們寫Python爬蟲程式的爬取網頁的基本過程就如上所述啦。
  在上一篇分享中,我們已瞭解瞭如何執行爬蟲程式。所以這一次,直接上程式!哈哈~~

# -*- coding: utf-8 -*-
"""
Created on Mon Aug  7 09:22:12 2017
@author: JClian
"""
import os
import re
import time
import datetime 
from selenium import webdriver  #匯入Selenium的webdriver
from selenium.webdriver.common.keys import Keys  #匯入Keys
from selenium.webdriver.common.action_chains import ActionChains
#匯入selenium的異常
from selenium.common.exceptions import TimeoutException,NoSuchElementException,WebDriverException def getSong(songer): chrome_options = webdriver.ChromeOptions() # 不載入圖片(提升載入速度);設定預設儲存檔案路徑 prefs = {"profile.managed_default_content_settings.images":2,\ "download.default_directory"
: 'F:\\download_music\%s' %songer} chrome_options.add_experimental_option("prefs",prefs) browser = webdriver.Chrome(chrome_options=chrome_options) #啟動瀏覽器 browser.maximize_window() #最大化 #設定網頁載入等待時間為20s,超過20s後則停止載入 browser.set_page_load_timeout(20) try: browser.get('https://www.baidu.com/') #獲取百度網頁 except TimeoutException: browser.execute_script('window.stop()') #在百度搜索欄搜尋“歌手 微盤”,並點選“百度一下”按鈕 browser.find_element_by_id("kw").send_keys('%s 微盤'% songer) browser.find_element_by_id("su").click() time.sleep(5) #對每一頁的搜尋記錄進行處理 def each_page(j): for i in range(1+10*j,11+10*j): print(datetime.datetime.now(),"第%d頁~~~~~~~~~~~~~~~~~~~"%i) #找到該條搜尋記錄,並點選 elem = browser.find_element_by_xpath("//*[@id='%d']/h3/a"%i) elem.click() time.sleep(10) #切換到新彈出的視窗 browser.switch_to_window(browser.window_handles[1]) #判斷是否是新浪微盤網頁,若是,則再判斷裡面分享的歌曲是否大於一首 if re.match('^http://vdisk.weibo.com/s',browser.current_url): print("這是一個新浪微盤的網頁!") t = browser.find_elements_by_class_name("short_name") if len(t) > 0: print("歌曲大於1首,不進行下載!\n") else: print("可以進行下載!") #統計此時下載資料夾中的檔案數量,作為下載成功的標誌 music_exit_flg = len(os.listdir("F:\\download_music\%s"%songer)) #找到該頁面的“下載”按鈕,並按下 elem = browser.find_element_by_id("download_big_btn").click() print("歌曲正在下載中...") time.sleep(8) #獲取歌曲的歌名資訊 file_name = browser.find_element_by_class_name("page_down_filename").text exit_flg = 0 #歌曲重新下載的標誌 while True: #如果下載資料夾檔案數量增加1,則下載成功,否則重新下載 if len(os.listdir("F:\\download_music\%s"%songer)) == (music_exit_flg+1): print("%s 下載成功!\n"%file_name) break else: browser.refresh() #重新整理網頁 time.sleep(5) music_exit_flg = len(os.listdir("F:\\download_music\%s"%songer)) elem = browser.find_element_by_id("download_big_btn").click() print("正在嘗試重新下載...") time.sleep(8) exit_flg += 1 if exit_flg == 3: #嘗試重新下載3次仍未下載後,則下載失敗 print("%s下載失敗啦~~\n" %file_name) break else: print(("這不是一個新浪微盤的網頁!\n")) #關閉當前視窗,並切換到原來的搜尋頁面 browser.close() time.sleep(2) browser.switch_to_window(browser.window_handles[0]) pages = 20 #設定爬取網頁的數量為20,即200條搜尋記錄 for i in range(pages): each_page(i) #點選該頁面中的“下一頁”按鈕 if i ==0: browser.find_element_by_class_name("n").click() else: browser.find_elements_by_class_name("n")[1].click() time.sleep(8) browser.close()#關閉視窗 print(datetime.datetime.now(),"%s的歌曲已操作完畢啦!" % songer) def main(): d1 = datetime.datetime.now() #要搜尋的歌手的列表 songer_lst = ['Westlife', 'Backstreet Boys', 'Michael Jackson', 'Owl City', 'James Blunt', \ 'Avril Lavigne','Tylor Swift','Beyonce', 'Groove Coverage', 'Jewel', 'Beyond'] for songer in songer_lst: #執行getSong()函式,並加入異常處理 try: print(datetime.datetime.now(),"開始搜尋%s的歌曲啦!"% songer) os.mkdir(os.path.join("F:\\download_music",songer)) #建立新資料夾 getSong(songer) except TimeoutException: print(datetime.datetime.now(),"%s的歌曲下載超時啦!嘿嘿~~"% songer) except NoSuchElementException: print(datetime.datetime.now(),"哎呦,除了點小問題... NoSuchElementException") except WebDriverException: print(datetime.datetime.now(),"哎呦,除了點小問題...WebDriverException") d2 = datetime.datetime.now() print("開始時間:",d1) print("結束時間:",d2) print("一共花費的時間:",d2-d1) main()

  筆者利用睡覺時間讓程式自己執行(注意設定電腦不休眠),執行結果如下(網速貌似有點不給力呢):
  執行結果
  再去電腦上檢視下載的檔案:
  資料夾
  在進入Westlife資料夾檢視:
  69個專案
  Westlife下載結果
  哈哈,厲害了,我的爬蟲!在網速不給力的情況下,程式還是跑了7個多小時,下載了674個檔案,已經很不錯啦,就是有部分下載檔案不是歌曲罷了,但已經符合筆者的期待了……


  筆者已將源程式放在碼雲網站上,歡迎大家下載,測試,批評指正。
  有了這個程式,你就能在電腦上,一邊看電影,一邊下載自己喜歡的歌手的歌曲啦。你也可以在自己上班或不用電腦的時候下載歌曲(注意設定電腦不休眠,網速要好!!!),回來後說不定滿滿的都是驚喜呢~~~
  期待下一篇分享^O^

注意:本人現已開通兩個微信公眾號: 用Python做數學(微訊號為:python_math)以及輕鬆學會Python爬蟲(微訊號為:easy_web_scrape), 歡迎大家關注哦~~