終于到了最后一步啦。還記得上一篇文章電影名和磁力鏈接都到了“快遞員”P(pán)ipeline手里嗎?這一部分我們就讓他處理包裹,實(shí)現(xiàn)百度網(wǎng)盤(pán)下載!
看看最后的效果吧!

Selenium
一查便知,Selenium - Web Browser Automation,它可進(jìn)行網(wǎng)頁(yè)瀏覽器的自動(dòng)化操縱,當(dāng)然也可以拿來(lái)模擬我們的手工操作啦。似乎感覺(jué)和……按鍵精靈、掛機(jī)腳本比較類(lèi)似。
我們需要的工具包括
- Selenium
pip install selenium
安裝即可
- Chrome瀏覽器
- Chromedriver
2.31版本下載 支持Chrome v58-60
安裝好之后大家可以先試一試以下代碼,看看效果如何?
(注意把chromedriver.exe放到和run.py同一目錄下)
from selenium import webdriver
path = 'chromedriver.exe'
browser = webdriver.Chrome(executable_path=path)
browser.get('http://pan.baidu.com/')

快遞員Pipeline.py
在該文件中主要需要寫(xiě)兩個(gè)函數(shù)
class DbPipeline(object):
def __init__(self):
pass
def process_item(self, item, spider):
pass
一個(gè)是初始化,用上述提到的方法來(lái)啟動(dòng)網(wǎng)頁(yè)。
一個(gè)是用來(lái)處理“貨物”,將磁力鏈接投遞到離線下載中。
模擬下載
先來(lái)看看我們平時(shí)怎么下載吧






我們需要對(duì)以上標(biāo)記的元素進(jìn)行點(diǎn)擊、輸入文本等操作完成離線下載。這些元素怎么找?
前面提到的Xpath當(dāng)然也可以用啦!
然而Selenium支持更多查找元素的方式,比如第一步中的按鈕,我們也可以用class這個(gè)屬性實(shí)現(xiàn)查找。

chg_field = self.driver.find_element_by_class_name('pass-login-tab').
find_element_by_class_name('account-title')
所以在這一步中,我們可以寫(xiě)出登錄網(wǎng)盤(pán)和部分離線下載的代碼啦。

改進(jìn)模擬行為
雖然是簡(jiǎn)單的模擬操縱瀏覽器,仍然會(huì)有許多問(wèn)題,主要包括下面幾點(diǎn)
欲速不達(dá)
如果直接試著將上述提到的離線下載的元素堆上去點(diǎn)擊,就像這樣

會(huì)有可能報(bào)錯(cuò):找不到想要的元素。為什么?新的網(wǎng)頁(yè)還沒(méi)加載好呢!他女朋友都找不到,你讓程序去問(wèn)他兒子在哪上小學(xué)合適嗎。

所以,我們要等!
這里用到的等待方法,學(xué)習(xí)的是這篇博文
三種等待方式的教程
驗(yàn)證碼
驗(yàn)證碼出現(xiàn)在查詢磁力鏈接信息并點(diǎn)下載之后

所以我們需要判斷這個(gè)框框是否被用戶給點(diǎn)掉了,點(diǎn)掉了再繼續(xù)執(zhí)行。
在這里一開(kāi)始我用的是
verify_locator=(By.XPATH,'//*[@id="downloadVerify"]')
WebDriverWait(self.driver, 20).until_not(EC.presence_of_element_located(verify_locator))
發(fā)現(xiàn)即使點(diǎn)掉之后還是會(huì)超時(shí),就是presence仍然為T(mén)rue。于是根據(jù)觀測(cè)現(xiàn)象改為
verify_locator=(By.XPATH,'//*[@id="downloadVerify"]')
WebDriverWait(self.driver, 20).until_not(EC.visibility_of_element_located(verify_locator))
即看不到了的話才繼續(xù)。
違規(guī)等錯(cuò)誤

然后離線下載的整個(gè)框就消失了,所以為了應(yīng)對(duì)這種狀況需要每次都嘗試點(diǎn)一下這個(gè)離線下載的按鈕。
另外是可能找不到種子信息。

還有就是丫種子地址出問(wèn)題,下載的是壓縮包什么的,導(dǎo)致選中的文件為空,點(diǎn)下載也點(diǎn)不動(dòng)。
吃我腦殘劈!
由于這里的初衷是盡可能多地下載排行榜中的電影,所以在這里沒(méi)有選擇根據(jù)各種情況分類(lèi)處理,而是選擇比較腦殘的方式:忽略錯(cuò)誤消息,管你那么多,就算你按鈕不存在,這幾個(gè)按鈕來(lái)回按總能下載到文件吧?所以每個(gè)元素的操作都用try except包圍起來(lái),報(bào)錯(cuò)也不管。
腦殘劈倒是挺省事,然而會(huì)導(dǎo)致漏網(wǎng)之魚(yú),即有的電影沒(méi)有下載成功。不過(guò)看著一溜溜的地址輸進(jìn)去,小電影多起來(lái)了山朗潤(rùn)起來(lái)了水漲起來(lái)了太陽(yáng)的臉紅起來(lái)了,也很滿足啦。

總結(jié)
Selenium可以當(dāng)作網(wǎng)頁(yè)版的 按鍵精靈 來(lái)使用;網(wǎng)頁(yè)元素的加載需要時(shí)間,需要設(shè)定Selenium進(jìn)行等待,等待有多種方式;最容易出錯(cuò)的便是網(wǎng)頁(yè)元素,有的時(shí)候可以選擇忽略錯(cuò)誤直接腦殘模擬。
當(dāng)然,還有很多缺點(diǎn),包括
- 腦殘的模擬導(dǎo)致漏網(wǎng)之魚(yú),不過(guò)我們?nèi)杂修k法記錄這些漏網(wǎng)之魚(yú)的信息,再來(lái)重新下載,就有待后續(xù)改進(jìn)啦。
- send_keys輸入文本是真的是輸入?。?!一長(zhǎng)串文本一個(gè)個(gè)字符往里蹦。

- 接著就是由于基于Chrome瀏覽器模擬,打開(kāi)網(wǎng)頁(yè)總是需要耗費(fèi)一定時(shí)間的,可以改用無(wú)界面的瀏覽器PhantomJS。
最限制速度的就是下載次數(shù)過(guò)多出現(xiàn)的驗(yàn)證碼了,導(dǎo)致整個(gè)項(xiàng)目還需要人工操作,也是亟待改進(jìn)的一點(diǎn)。
下一篇文章將介紹通過(guò)Cookies登錄+抓包進(jìn)行離線下載的方法。
本項(xiàng)目代碼:
github_douban
過(guò)往文章:
網(wǎng)易云音樂(lè)評(píng)論抓取實(shí)驗(yàn)(1)接口獲取
Python自動(dòng)生成簡(jiǎn)書(shū)過(guò)往文章鏈接Markdown格式文本
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤(pán)下載(4)Cookies免登錄+抓包下載
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤(pán)下載(3)Selenium離線下載
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤(pán)下載(2)Scrapy深入 “打包員”“快遞員”
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤(pán)下載(1)Scrapy爬蟲(chóng)框架