??本篇分享將講解如何利用Python爬蟲在百度上下載新浪微盤里自己想要的歌手的歌曲,隨便挑個(gè)你喜歡的歌手巨缘!
??首先我們先探索一下我們操作的步驟(以下載Westlife的歌曲為例):打開百度,輸入"Westlife 微盤"采呐,將彈出如下頁(yè)面:
??第1若锁,2條是新浪微盤的搜索記錄,但第1條記錄中的歌曲大于1首斧吐,我們將不對(duì)其進(jìn)行下載又固,下載的網(wǎng)頁(yè)類似于一下頁(yè)面:
??接下來(lái)點(diǎn)擊該頁(yè)面的下載按鈕即可下載仲器,等待一會(huì)兒關(guān)閉當(dāng)前網(wǎng)頁(yè)回到原所搜頁(yè)面,再對(duì)下一條記錄進(jìn)行處理仰冠。我們寫Python爬蟲程序的爬取網(wǎng)頁(yè)的基本過程就如上所述啦乏冀。
??在上一篇分享中,我們已了解了如何運(yùn)行爬蟲程序洋只。所以這一次辆沦,直接上程序!哈哈~~
# -*- 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 #導(dǎo)入Selenium的webdriver
from selenium.webdriver.common.keys import Keys #導(dǎo)入Keys
from selenium.webdriver.common.action_chains import ActionChains
#導(dǎo)入selenium的異常
from selenium.common.exceptions import TimeoutException,NoSuchElementException,WebDriverException
def getSong(songer):
chrome_options = webdriver.ChromeOptions()
# 不加載圖片(提升加載速度)木张;設(shè)置默認(rèn)保存文件路徑
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) #啟動(dòng)瀏覽器
browser.maximize_window() #最大化
#設(shè)置網(wǎng)頁(yè)加載等待時(shí)間為20s,超過20s后則停止加載
browser.set_page_load_timeout(20)
try:
browser.get('https://www.baidu.com/') #獲取百度網(wǎng)頁(yè)
except TimeoutException:
browser.execute_script('window.stop()')
#在百度搜索欄搜索“歌手 微盤”众辨,并點(diǎn)擊“百度一下”按鈕
browser.find_element_by_id("kw").send_keys('%s 微盤'% songer)
browser.find_element_by_id("su").click()
time.sleep(5)
#對(duì)每一頁(yè)的搜索記錄進(jìn)行處理
def each_page(j):
for i in range(1+10*j,11+10*j):
print(datetime.datetime.now(),"第%d頁(yè)~~~~~~~~~~~~~~~~~~~"%i)
#找到該條搜索記錄,并點(diǎn)擊
elem = browser.find_element_by_xpath("http://*[@id='%d']/h3/a"%i)
elem.click()
time.sleep(10)
#切換到新彈出的窗口
browser.switch_to_window(browser.window_handles[1])
#判斷是否是新浪微盤網(wǎng)頁(yè)舷礼,若是鹃彻,則再判斷里面分享的歌曲是否大于一首
if re.match('^http://vdisk.weibo.com/s',browser.current_url):
print("這是一個(gè)新浪微盤的網(wǎng)頁(yè)!")
t = browser.find_elements_by_class_name("short_name")
if len(t) > 0:
print("歌曲大于1首妻献,不進(jìn)行下載蛛株!\n")
else:
print("可以進(jìn)行下載!")
#統(tǒng)計(jì)此時(shí)下載文件夾中的文件數(shù)量育拨,作為下載成功的標(biāo)志
music_exit_flg = len(os.listdir("F:\\download_music\%s"%songer))
#找到該頁(yè)面的“下載”按鈕谨履,并按下
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 #歌曲重新下載的標(biāo)志
while True:
#如果下載文件夾文件數(shù)量增加1,則下載成功熬丧,否則重新下載
if len(os.listdir("F:\\download_music\%s"%songer)) == (music_exit_flg+1):
print("%s 下載成功笋粟!\n"%file_name)
break
else:
browser.refresh() #刷新網(wǎng)頁(yè)
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(("這不是一個(gè)新浪微盤的網(wǎng)頁(yè)法希!\n"))
#關(guān)閉當(dāng)前窗口姐扮,并切換到原來(lái)的搜索頁(yè)面
browser.close()
time.sleep(2)
browser.switch_to_window(browser.window_handles[0])
pages = 20 #設(shè)置爬取網(wǎng)頁(yè)的數(shù)量為20预侯,即200條搜索記錄
for i in range(pages):
each_page(i)
#點(diǎn)擊該頁(yè)面中的“下一頁(yè)”按鈕
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()#關(guān)閉窗口
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: #運(yùn)行g(shù)etSong()函數(shù)播歼,并加入異常處理
try:
print(datetime.datetime.now(),"開始搜索%s的歌曲啦植旧!"% songer)
os.mkdir(os.path.join("F:\\download_music",songer)) #創(chuàng)建新文件夾
getSong(songer)
except TimeoutException:
print(datetime.datetime.now(),"%s的歌曲下載超時(shí)啦漠趁!嘿嘿~~"% songer)
except NoSuchElementException:
print(datetime.datetime.now(),"哎呦佑菩,除了點(diǎn)小問題... NoSuchElementException")
except WebDriverException:
print(datetime.datetime.now(),"哎呦盾沫,除了點(diǎn)小問題...WebDriverException")
d2 = datetime.datetime.now()
print("開始時(shí)間:",d1)
print("結(jié)束時(shí)間:",d2)
print("一共花費(fèi)的時(shí)間:",d2-d1)
main()
??筆者利用睡覺時(shí)間讓程序自己運(yùn)行(注意設(shè)置電腦不休眠),運(yùn)行結(jié)果如下(網(wǎng)速貌似有點(diǎn)不給力呢):
??再去電腦上查看下載的文件:
在進(jìn)入Westlife文件夾查看:
??哈哈殿漠,厲害了赴精,我的爬蟲!在網(wǎng)速不給力的情況下绞幌,程序還是跑了7個(gè)多小時(shí)蕾哟,下載了674個(gè)文件,已經(jīng)很不錯(cuò)啦,就是有部分下載文件不是歌曲罷了渐苏,但已經(jīng)符合筆者的期待了......
??筆者已將源程序放在碼云網(wǎng)站上,歡迎大家下載菇夸,測(cè)試琼富,批評(píng)指正。
??有了這個(gè)程序庄新,你就能在電腦上鞠眉,一邊看電影,一邊下載自己喜歡的歌手的歌曲啦择诈。你也可以在自己上班或不用電腦的時(shí)候下載歌曲(注意設(shè)置電腦不休眠械蹋,網(wǎng)速要好!P呱帧;└辍),回來(lái)后說不定滿滿的都是驚喜呢~~~
??期待下一篇分享~~