Python爬蟲——百度+新浪微盤下載歌曲
阿新 • • 發佈:2019-01-03
本篇分享將講解如何利用Python爬蟲在百度上下載新浪微盤裡自己想要的歌手的歌曲,隨便你喜歡的歌手!
首先我們先探索一下我們操作的步驟(以下載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資料夾檢視:
哈哈,厲害了,我的爬蟲!在網速不給力的情況下,程式還是跑了7個多小時,下載了674個檔案,已經很不錯啦,就是有部分下載檔案不是歌曲罷了,但已經符合筆者的期待了……
筆者已將源程式放在碼雲網站上,歡迎大家下載,測試,批評指正。
有了這個程式,你就能在電腦上,一邊看電影,一邊下載自己喜歡的歌手的歌曲啦。你也可以在自己上班或不用電腦的時候下載歌曲(注意設定電腦不休眠,網速要好!!!),回來後說不定滿滿的都是驚喜呢~~~
期待下一篇分享^O^
注意:本人現已開通兩個微信公眾號: 用Python做數學(微訊號為:python_math)以及輕鬆學會Python爬蟲(微訊號為:easy_web_scrape), 歡迎大家關注哦~~