Python爬蟲(2)利用新浪微盤下載周杰倫的歌曲(共190首)

??本篇分享將實(shí)現(xiàn)在新浪微盤上下載周杰倫的歌曲腊满,一共190首,下載的網(wǎng)頁(yè)網(wǎng)址為http://vdisk.weibo.com/s/arjVBmagFKiLy年栓,頁(yè)面如下:
  

新浪微盤 周杰倫歌曲

??先定一個(gè)小目標(biāo):下載本頁(yè)面中的所有190首歌曲拆挥!怎么樣,有沒(méi)有一點(diǎn)心動(dòng)的感覺(jué)呢某抓?哈哈纸兔,當(dāng)然講解爬蟲前,需要一些準(zhǔn)備工作:

  1. 安裝Anaconda以及Selenium模塊
  2. 安裝Chrome瀏覽器驅(qū)動(dòng)
  3. 一些基礎(chǔ)的Python編程知識(shí)
  4. 一顆好奇的心

??首先在Anaconda官網(wǎng)上下載適合自己電腦的Anaconda版本否副。下載完后打開Anaconda Prompt,輸入pip install selenium安裝selenium模塊汉矿。
  

pip install selenium

??耐心等待安裝,安裝完后再輸入conda list selenium,如出現(xiàn)以下信息备禀,則表示安裝成功洲拇。
  
conda list selenium

??接下來(lái)安裝Chrome瀏覽器驅(qū)動(dòng),可以在http://npm.taobao.org/mirrors/chromedriver/2.31/ 上下載曲尸,Windows系統(tǒng)選擇chromedriver_win32.zip 文件赋续。這是一個(gè)壓縮包,解壓后存到一個(gè)目錄中另患,然后把該目錄添加到環(huán)境變量纽乱。
??在Spyder上運(yùn)行Python程序源代碼(或者在碼云網(wǎng)站上下載Python源代碼Chrome_song_download_with_Class.py),源代碼如下:

import os
import re
import bs4
import time
import datetime
import urllib.request  
from bs4 import BeautifulSoup  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains


class download_songs(object):
    def __init__(self,url,save_file_name):
        self.url = url
        self.save_file_name = save_file_name
        
    def get_song_names(self):
        html = urllib.request.urlopen(self.url)  
        content = html.read()  
        html.close()
        print("已獲得該頁(yè)面!")
        soup = BeautifulSoup(content, "lxml")
        print("頁(yè)面解析完畢昆箕!進(jìn)入歌曲下載...")        
        song_lst = soup.find_all('a', class_="short_name")
        print("一共找到%d首歌曲鸦列!\n"% len(song_lst))
        song_names = [song.string for song in song_lst]
        
        return song_names
    
    def get_songs(self):
        #設(shè)置Chrome瀏覽器租冠,并啟動(dòng)
        chrome_options = webdriver.ChromeOptions()
        # 不加載圖片(提升加載速度);設(shè)置默認(rèn)保存文件徑路
        prefs = {"profile.managed_default_content_settings.images":2,\
                 "download.default_directory": '%s' %self.save_file_name}
        chrome_options.add_experimental_option("prefs",prefs)
        browser = webdriver.Chrome(chrome_options=chrome_options) #啟動(dòng)瀏覽器
        print("瀏覽器已啟動(dòng)")
        song_names = self.get_song_names()
        browser.maximize_window() #窗口最大化
        browser.set_page_load_timeout(30) # 最大等待時(shí)間為30s
        
        #當(dāng)加載時(shí)間超過(guò)30秒后薯嗤,自動(dòng)停止加載該頁(yè)面
        try:
            browser.get(self.url)
        except TimeoutException:
            browser.execute_script('window.stop()')
         
        #遍歷所有的tags,下載歌曲
        for i in range(len(song_names)):
            #當(dāng)開始的12首歌下載完后顽爹,需要下拉網(wǎng)頁(yè)內(nèi)嵌的滾動(dòng)條
            if i >= 12:
                #找到網(wǎng)頁(yè)內(nèi)嵌的滾動(dòng)條
                Drag = browser.find_element_by_class_name("jspDrag")
                #獲取滾動(dòng)槽的高度
                groove = browser.find_element_by_class_name("jspTrack")
                height_of_groove = int(re.sub("\D","",str(groove.get_attribute("style"))))
                #利用鼠標(biāo)模擬拖動(dòng)來(lái)下拉該滾動(dòng)條
                move_of_y = i * height_of_groove/len(song_names) #每次下拉的滾動(dòng)條的高度
                ActionChains(browser).drag_and_drop_by_offset(Drag, 0, move_of_y).perform() 
            
            elem_lst = browser.find_elements_by_class_name("short_name") #所有歌的tags
            elem= elem_lst[i]
            elem.click()  #點(diǎn)擊該tag,切換到該歌曲的下載頁(yè)面
            time.sleep(5)
            button = browser.find_element_by_id("download_big_btn") #按下下載按鈕
            print("已找到第%d首歌: %s"%(i+1, song_names[i]))
            button.click()
            print("%s 正在下載中..."%song_names[i])
            file_exit_flg = len(os.listdir(r"%s"%self.save_file_name))
            time.sleep(8)
            #歌曲是否存在處理,如果存在骆姐,輸出“下載成功”镜粤,否則等待15秒,再次判斷后決定是否刷新頁(yè)面
            
            if len(os.listdir(r"%s"%self.save_file_name)) == file_exit_flg +1:
                print("%s 下載成功诲锹!\n"%song_names[i])
            else:
                exit_flag = 0 #退出標(biāo)志繁仁,嘗試下載5次涉馅,5次下載仍未成功后輸出“下載失敗!”
                while True:
                    time.sleep(8)

                    if len(os.listdir(r"%s"%self.save_file_name)) == file_exit_flg +1:
                        print("%s 下載成功归园!\n"%song_names[i])
                        break
                    print("%s 下載未成功,再次嘗試下載稚矿!"%song_names[i])
                    browser.refresh() #等待15秒后庸诱,文件還未下載,則刷新網(wǎng)頁(yè)
                    time.sleep(5)
                    print("已刷新網(wǎng)頁(yè)晤揣!")
                    
                    #刷新網(wǎng)頁(yè)后執(zhí)行剛才的操作
                    button = browser.find_element_by_id("download_big_btn")
                    button.click()
                    print("%s 正在下載中..."%song_names[i])
                    file_exit_flg = len(os.listdir(r"%s"%self.save_file_name))
                    time.sleep(8)
                    exit_flag += 1
                    if exit_flag == 2:
                        print("%s 下載失斍潘!\n"%song_names[i])
                        break
                    
            browser.back() # 網(wǎng)頁(yè)后退
            time.sleep(8)
    
        browser.close() #操作結(jié)束昧识,關(guān)閉Chrome瀏覽器
        print("\n本頁(yè)面操作已經(jīng)結(jié)束!請(qǐng)前往下載位置(%s)查看下載文件.  Y(^O^)Y "% self.save_file_name)
        
        

def main():
    d1 = datetime.datetime.now()
    #下載歌曲的網(wǎng)頁(yè)網(wǎng)址
    url = 'http://vdisk.weibo.com/s/arjVBmagFKiLy'
    #保存文件的目錄
    save_file_name = "F:\music\music_of_周杰倫"
    for_test = download_songs(url,save_file_name)
    try:
        for_test.get_songs()
    except TimeoutException:
        sum_of_files = len(os.listdir(save_file_name))
        print("下載超時(shí)啦D扑摹!跪楞!此次操作共下載了%d首歌(可能有重復(fù)或未下載完的)缀去,到此就結(jié)束了哦 ^o^" % sum_of_files)
    d2 = datetime.datetime.now()
    print("開始時(shí)間:",d1)
    print("結(jié)束時(shí)間:",d2)
    print("一共用時(shí):",d2-d1)
    
main()

??筆者利用空余時(shí)間,在自己的電腦上運(yùn)行后的結(jié)果如下:
  

運(yùn)行結(jié)果

??190首歌曲下載花了102.5分鐘甸祭,平均每首歌32.2s,運(yùn)行結(jié)果還是相當(dāng)可以的,how exiting!!!
??該程序適合下載新浪微盤上分享的歌曲缕碎,類似于本例,這樣的網(wǎng)址還是很多的池户,可以在碼云網(wǎng)站上下載新浪微盤網(wǎng)址文檔.txt.歡迎大家進(jìn)行測(cè)試咏雌,可以單個(gè)測(cè)試,也可以寫成字典dict測(cè)試校焦。


  由于筆者時(shí)間倉(cāng)促和技術(shù)水平有限赊抖,代碼中可能會(huì)存在一些錯(cuò)誤和不足之處,希望廣大網(wǎng)友能批評(píng)指導(dǎo)U洹7昭!歡迎大家下載代碼凝赛,歡迎大家一起交流~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末注暗,一起剝皮案震驚了整個(gè)濱河市坛缕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捆昏,老刑警劉巖赚楚,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骗卜,居然都是意外死亡宠页,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門寇仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)举户,“玉大人,你說(shuō)我怎么就攤上這事遍烦〖筻遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵服猪,是天一觀的道長(zhǎng)供填。 經(jīng)常有香客問(wèn)我,道長(zhǎng)罢猪,這世上最難降的妖魔是什么近她? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮膳帕,結(jié)果婚禮上粘捎,老公的妹妹穿的比我還像新娘。我一直安慰自己危彩,他們只是感情好攒磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恬砂,像睡著了一般咧纠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泻骤,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天漆羔,我揣著相機(jī)與錄音,去河邊找鬼狱掂。 笑死演痒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趋惨。 我是一名探鬼主播鸟顺,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了讯嫂?” 一聲冷哼從身側(cè)響起蹦锋,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欧芽,沒(méi)想到半個(gè)月后莉掂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千扔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年憎妙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曲楚。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厘唾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龙誊,到底是詐尸還是另有隱情抚垃,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布载迄,位于F島的核電站讯柔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏护昧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一粗截、第九天 我趴在偏房一處隱蔽的房頂上張望惋耙。 院中可真熱鬧,春花似錦熊昌、人聲如沸绽榛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灭美。三九已至,卻和暖如春昂利,著一層夾襖步出監(jiān)牢的瞬間届腐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工蜂奸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犁苏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓扩所,卻偏偏與公主長(zhǎng)得像围详,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祖屏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容