Python實現(xiàn)網(wǎng)頁視頻下載(含VIP)

2019.10.5

我是個假面騎士廚,雖然很感謝某視頻網(wǎng)站引進(jìn)了正版的假面騎士。但這也直接斷絕了曾經(jīng)極其方便的資源,大量的資源被清洗。雖然本人也很樂意花錢買會員看正版,只是突然發(fā)現(xiàn)很多網(wǎng)站下載免費視頻都要下載客戶端,于是乎想寫個爬蟲下載視頻。經(jīng)過斷斷續(xù)續(xù)一周的摸索,最后決定寫一個可以下普通視頻和VIP視頻的爬蟲。 程序僅用于自己娛樂,不用于商業(yè)用途。


下載中....

一. 使用到的Python庫


1. urllib.request

urllib.request模塊定義了有助于在復(fù)雜環(huán)境中打開URL(主要是HTTP)的函數(shù)和類-基本身份驗證和摘要身份驗證,重定向,Cookie等??梢詫崿F(xiàn)通過代碼來模擬向服務(wù)器發(fā)送請求并獲取html代碼,以達(dá)到爬取網(wǎng)頁內(nèi)容的目的。

  • urllib.request.urlopen(url, data=None, [timeout, ], cafile=None, capath=None, cadefault=False, context=None) :用于向服務(wù)器發(fā)起請求,實例化HTTP對象,獲取url的資源,通過 read() 方法獲取其內(nèi)容( 如果要顯示html,還要用decode()將其轉(zhuǎn)為‘utf-8’編碼 )。

2. urllib.parse.quote

該模塊將URL(統(tǒng)一資源定位符)字符串分解成其組件(地址方案,網(wǎng)絡(luò)位置,路徑等),將組件重新組裝成URL,并指定“相對URL”定義用于基于“基本URL”轉(zhuǎn)換為絕對URL的標(biāo)準(zhǔn)接口此處用于將搜索的關(guān)鍵詞中包含的中文轉(zhuǎn)換為utf-8編碼的字符。


3. bs4.BeautifulSoup

  1. Beautiful Soup提供了一些用于 導(dǎo)航,搜索和修改解析樹的簡單方法和Pythonic習(xí)慣用法:用于剖析文檔并提取所需內(nèi)容的工具箱。
  2. Beautiful Soup會自動將傳入文檔轉(zhuǎn)換為Unicode,將傳出文檔轉(zhuǎn)換為UTF-8。您不必考慮編碼,除非文檔未指定編碼并且Beautiful Soup無法檢測到編碼。然后,您只需要指定原始編碼即可
  3. Beautiful Soup位于流行的Python解析器(如lxmlhtml5lib)的頂部,使您可以嘗試不同的解析策略或提高靈活性。
  • bs4.BeautifulSoup.find_all( name, attrs, recursive, text, limit, **kwargs )
    傳入html文本,選擇parser(如'html.parser')之后便可以實例化一個BeautifulSoup對象。之后便可以使用 find_all(tag_name) 來尋找 所有的 tag_name標(biāo)簽的內(nèi)容。返回一個列表,是獲得的內(nèi)容。

4. selenium

用于自動化Web應(yīng)用程序以進(jìn)行測試,可模擬人工對瀏覽器進(jìn)行各種各樣的操作,但一定要下載與自己瀏覽器相同版本的driver。

  1. selenium.webdriver

    用于實例化一個瀏覽器類。我使用的是Chrome瀏覽器,所以在使用這個庫之前需要安裝 chromedriver ,并且必須和自己的瀏覽器的版本相同。如果你要下安裝其他的driver,請轉(zhuǎn)至官網(wǎng)。

  2. selenium.webdriver.ActionChains

    用于模擬執(zhí)行鏈?zhǔn)叫袨榈膸?,可以模擬鼠標(biāo)鍵盤對瀏覽器的行為。 (缺陷:只能對html進(jìn)行模擬鍵鼠的行為,無法進(jìn)行系統(tǒng)的操作)


5. win32clipboard

Windows系統(tǒng)下,Python可以使用此庫來打開剪切板和關(guān)閉剪切板并獲取其內(nèi)容。 這也是為何我的程序只能在windows下運行的原因。


6. pyautogui

用于自動化對GUI進(jìn)行操作,對比ActionChains的優(yōu)勢在于pyautogui 可以操作瀏覽器上系統(tǒng)的操作。
缺陷: 鼠標(biāo)的焦點必須停留在要操作的窗口,否則,將會有意想不到的結(jié)果發(fā)生



二. 思路解析

(注:下面出現(xiàn)的代碼并不完整,完整的代碼請到該項目的我的github倉庫


1. 利用API類來獲取接口

利用我所知的一個接口(頁面內(nèi)有其他的接口的轉(zhuǎn)換),使用pyautogui模擬鼠標(biāo)點擊,html內(nèi)才會顯示所有的接口,爬下來,以作備用。


接口們

2. 爬取首頁的專輯鏈接

由于我從一開始就是想下載整部作品,并且我在調(diào)試時用于搜索的URL出來的網(wǎng)頁只有一個合輯(有些頁面擁有多個合輯),并且不同的作品可能有不同的標(biāo)簽名。所以我寫出來的成品只適合我用于調(diào)試的那個合輯,如果要用作其他作品的爬取,則要修改Get_list()的內(nèi)容。才能獲取正確的鏈接。


1. 根據(jù)輸入的關(guān)鍵詞搜索到騰訊視頻的首頁,獲取第一集的超鏈接,跳轉(zhuǎn)到第一集的播放頁面,從而從側(cè)邊欄的劇集中獲取所有視頻的鏈接,使用列表存儲。

# get the html by keyword
main_res = request.urlopen(self.url)
result_html = main_res.read()
# change the encode
main_data = result_html.decode("utf-8")
main_soup = BeautifulSoup(main_data, 'html.parser')
# get the first video from album
href = main_soup.find_all('a', attrs={'_stat': 'video:poster_num'})[0]['href']

# jump to the play page
play_res = request.urlopen(href)
play_html = play_res.read()
play_data = play_html.decode("utf-8")
play_soup = BeautifulSoup(play_data, 'html.parser')

# Get all the link of page
# The first link is incorrect
self.links = []
for list in play_soup.find_all('a', attrs={'_stat': "videolist:click"})[5:]:
    self.links.append('https://v.qq.com' + list['href'])

以上的代碼僅適合我的關(guān)鍵詞的頁面,其他的劇集需要根據(jù)實際的html代碼爬取。

播放界面
劇集列表

2. 利用API類獲取的接口進(jìn)入到頁面,使用selenium模擬瀏覽器行為,打開用接口加載的網(wǎng)頁

url = '接口' + link
# use webdriver simulate the action of chrome
browser = webdriver.Chrome(executable_path='./chromedriver.exe')
browser.get(url)
time.sleep(10)  # wait the url loading

selenium使用webdriver庫來實例化瀏覽器對象,可以模擬瀏覽器的行為。 有趣的是:selenium會真的打開一個瀏覽器。所以,有以下注意事項:

  • 必須下載匹配自己電腦的瀏覽器的driver,比如我使用的是chorme,就下載了chromedriver.exe(Mac和Linux環(huán)境下也有自己的版本)。
  • 必須填寫executable_path這個參數(shù),告訴selenium要使用哪個driver。
  • 可以使用time包下的sleep()函數(shù)來讓模擬的瀏覽器休眠一定時間,讓其加載好例如js等文件,獲取完整的html。
  • selenium可以使用"find_element[s]_by_[....]( )"系列的函數(shù)來查找html中的元素,例如
    # find the first element whose tag name is 'div'
    right_click = browser.find_element_by_tag_name('div')
    # find all elements whose tag name is 'div'
    right_click = browser.find_elements_by_tag_name('div')
    

3. 使用pyautogui來自動化右鍵頁面,復(fù)制視頻的真實地址

right_click = browser.find_element_by_tag_name('div')
# ActionChain could simulate the action of mouse and keyboard
rightclick = ActionChains(browser)

# double right click, get the menu
rightclick.context_click(right_click)
rightclick.context_click(right_click).perform()
time.sleep(1)

# choose the "copy video address..." option
pyautogui.typewrite(['down', 'down', 'down', 'down', 'down'])
time.sleep(1)
# it must write the "enter", else the choice can't be chosen
pyautogui.typewrite(['enter'])
time.sleep(1)
  • 右鍵的模擬使用了selenium內(nèi)的ActionChains類,先實例化一個對象。然后先使用find_element類函數(shù)找到需要點擊的html控件或者標(biāo)簽。
  • context_click()函數(shù)是actionchains中模擬右鍵行為的函數(shù),我在這里被坑過,click()是左鍵的函數(shù)。并且,必須使用perform()函數(shù)來使actionchains對象進(jìn)行連鎖操作,否則不會進(jìn)行一連串操作。
  • 其實actionchains中也有選擇右鍵菜單的函數(shù),比如send_keys()函數(shù),但遺憾的是,此類函數(shù)只能操作頁面的右鍵的菜單選擇的行為。而我爬視頻中的右鍵菜單是只有系統(tǒng)的菜單才會有視頻的真實地址的,所以這就需要用到pyautogui了
  • pyautogui使用 typewrite() 來對系統(tǒng)選項進(jìn)行操作, 并且最后一定要執(zhí)行'enter',否則爬蟲不會將其識別為選擇了菜單(Mac系統(tǒng)不是enter)
  • pyautogui的缺點就是不能讓鼠標(biāo)焦點離開要操作的界面,否則它會操作其他的界面,出現(xiàn)奇怪的現(xiàn)象。
  • 也是因為這些win32的庫,致使這個程序只能在windows系統(tǒng)下運行。

4. 獲取剪切板的內(nèi)容,得到視頻真實地址,利用os寫入系統(tǒng)

import win32clipboard as wc
wc.OpenClipboard()
url = wc.GetClipboardData(win32con.CF_TEXT)
wc.CloseClipboard()  # it must be close, else we will get the same url from clipboard
  • 打開剪切板使用完之后, 一定要關(guān)閉剪切板,否則下次剪切板的內(nèi)容永遠(yuǎn)都不會改變!


三. 總結(jié)

這次的爬蟲主要是寫著玩一下。最初只是為了寫爬蟲而已,誰知道后來陸陸續(xù)續(xù)地出現(xiàn)了接口下載VIP視頻,用selenium來模擬瀏覽器行為,用pyautogui來操作GUI。嘛,我覺得當(dāng)中遇到的錯誤挺有趣的,所以記錄一下,希望以后不要犯相同的錯誤。希望自己能慢慢成為舍友那樣的大牛。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容