最近遇到一個(gè)需求:根據(jù)優(yōu)酷ios客戶端分享來(lái)的鏈接耘成,提取出視頻源,并在ios系統(tǒng)播放器播放驹闰。在踩了一些坑之后瘪菌,筆者對(duì)視頻網(wǎng)站的提取也有了一些經(jīng)驗(yàn),在此做個(gè)總結(jié)嘹朗,為以后遇到這個(gè)問(wèn)題的同學(xué)提供一些經(jīng)驗(yàn)和方向师妙。
1. 簡(jiǎn)介
提取網(wǎng)站視頻鏈接分三種情況:
- 電腦版網(wǎng)頁(yè)鏈接,在查看這類(lèi)網(wǎng)頁(yè)源代碼時(shí)會(huì)發(fā)現(xiàn)視頻源為flash文件屹培,無(wú)法獲取有效的視頻地址默穴,需要使用第三方庫(kù)You-Get
- 遺憾的是You-Get并非支持所有的視頻網(wǎng)站怔檩,對(duì)于不能支持的視頻網(wǎng)站,需要設(shè)置User-Agent模擬iPhone用戶進(jìn)行提取壁顶,或者破解其加密方式
- iPhone Safair中的視頻源珠洗,這個(gè)是本文的重點(diǎn)
2. 使用You-Get抓取視頻地址
You-Get 實(shí)際上是一個(gè)視頻下載器,用 Python3 編寫(xiě)若专,運(yùn)行在命令行環(huán)境而不是GUI许蓖。它支持很多視頻網(wǎng)站,具體可以看Github項(xiàng)目的介紹调衰,并且持續(xù)更新中膊爪。
安裝You-Get
You-Get 運(yùn)行在 Python3 環(huán)境下,不支持Python2.x嚎莉。所以在開(kāi)始之前米酬,系統(tǒng)中至少有一個(gè)Python3.x版本。
雖然項(xiàng)目介紹中說(shuō)明可以直接編譯源碼安裝趋箩,但是如果沒(méi)有特殊要求赃额,使用 pip
是最簡(jiǎn)單的安裝方式。
pip
的安裝可以查看這篇文章pip installation叫确。
使用pip安裝You-get
$ [sudo] pip3 install you-get
檢查是否安裝成功
$ you-get -V
使用You-Get下載視頻
$ you-get http://youtu.be/sGwy8DsUJ4M
顯示視頻信息
$ you-get -u http://youtu.be/sGwy8DsUJ4M
使用you-get -u $link
返回視頻信息跳芳,然后用正則表達(dá)式將視頻鏈接提取出來(lái)即可。
一些問(wèn)題
- ios系統(tǒng)播放器只支持mp4和mov等少數(shù)幾種視頻格式竹勉。但是在下載的視頻中很多是flv格式飞盆,無(wú)法在系統(tǒng)播放器中播放。
- 手機(jī)中分享來(lái)的視頻網(wǎng)址無(wú)法使用You-Get提取視頻次乓。
- You-Get并非支持所有視頻網(wǎng)站吓歇。
3. 提取手機(jī)Safari的視頻鏈接
雖然ios系統(tǒng)不支持flv等視頻格式,但是優(yōu)酷等網(wǎng)站在safari中仍可以播放票腰。所以筆者猜測(cè)在手機(jī)端視頻并非以falsh文件方式播放城看。通過(guò)設(shè)置User-Agent Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4
模擬手機(jī)瀏覽器訪問(wèn)視頻網(wǎng)站,在源代碼中可以得到視頻鏈接杏慰。
視頻鏈接 http://v.youku.com/v_show/id_XMTMzMzkxNzgwOA==_ev_1.html?x
以及網(wǎng)頁(yè)源代碼
圖中src就是我們需要的內(nèi)容测柠。
知道了源碼中含有視頻鏈接就好辦多了,只要我們獲取到源碼逃默,然后利用正則表達(dá)式提取出視頻鏈接即可鹃愤。但是簇搅,嘗試后發(fā)現(xiàn)完域,視頻標(biāo)簽部分是動(dòng)態(tài)獲取的娇豫,破解js比較麻煩街望,而且并不通用艘包,所以這里采用一種簡(jiǎn)單粗暴的方案:
在服務(wù)器端運(yùn)行一個(gè)虛擬窗口,通過(guò)調(diào)用瀏覽器加載網(wǎng)頁(yè)鞍时,并對(duì)最終代碼做正則提取出視頻地址。
運(yùn)行環(huán)境
CentOs系統(tǒng)幌缝,使用python3.4版本奋刽,1M帶寬,F(xiàn)ireFox瀏覽器
使用Splinter調(diào)用瀏覽器
Splinter是一款Python自動(dòng)化測(cè)試工具异旧,可以模擬瀏覽器的行為意述。可以運(yùn)行js吮蛹,支持鼠標(biāo)操作等荤崇。
安裝穩(wěn)定版
$ [sudo] pip install splinter
或者源碼安裝
$ git clone git://github.com/cobrateam/splinter.git
$ cd splinter
$ [sudo] python setup.py install
代碼示例
browser = Browser()
browser.visit(url)
html = browser.html
browser.quit()
運(yùn)行虛擬桌面
centos服務(wù)器是沒(méi)有桌面的。為了能在服務(wù)器中調(diào)用瀏覽器進(jìn)行渲染潮针,筆者在centos命令行界面運(yùn)行一個(gè)虛擬的桌面术荤。Xvfb
新建一個(gè)虛擬的X窗口,配合python的pyvirtualdisplay
進(jìn)行操作每篷。
安裝
# 安裝Xvfb和pyvirtualdisplay
yum install xorg-x11-server-Xvfb
pip install pyvirtualdisplay
安裝firefox
和selenium
yum install firefox
pip install selenium
代碼
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(800, 600))
display.start()
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
print browser.title
browser.quit()
display.stop()
Talk is cheap, Show me the fucking code
from splinter import Browser
from selenium.webdriver import PhantomJS, DesiredCapabilities
from splinter.driver.webdriver import (BaseWebDriver, WebDriverElement as BaseWebDriverElement)
from pyvirtualdisplay import Display
from selenium import webdriver
import re
import json
def fetch_info(url):
html = download_html(url)
videoUrl = parse_html(url, html)
resultDic = {'ret' : 0, 'srcUrl' : url, 'title' : url, 'abstract' : url, 'qsvideo' : videoUrl}
print(json.dumps(resultDic))
pass
def download_html(url):
display = Display(visible=0, size=(800, 600))
display.start()
browser = Browser(user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4")
browser.visit(url)
html = browser.html
browser.quit()
display.stop()
return html
pass
def parse_html(url, html):
matchObj = re.search(r'<div class="tvp_video"><video(.*)src="(.*)"></video>', html)
if matchObj:
videoUrl = matchObj.group(2)
return videoUrl
return ""
pass
if __name__ == '__main__':
url = "http://v.youku.com/v_show/id_XMTMyOTU4NTc4OA==.html"
fetch_info(url)
4. 第二種情況
對(duì)于第二種情況瓣戚,You-Get不能支持的視頻網(wǎng)站,需要設(shè)置User-Agent偽裝為iPhone用戶進(jìn)行提取焦读,或者破解其加密方式子库。
5. 小結(jié)
總的來(lái)說(shuō),這是一種可行的抓取方案吨灭。但是刚照,因?yàn)樾枰獮g覽器啟動(dòng)加載網(wǎng)頁(yè),對(duì)于條件比較苛刻的環(huán)境中效率相對(duì)較低喧兄。就筆者而言无畔,在1M的帶寬中抓取一個(gè)視頻鏈接需要幾十秒的時(shí)間,這幾乎是不能忍受的吠冤。因此如何在低帶寬中提高速度仍需要挖掘浑彰。目前猜測(cè)耗時(shí)可能是因?yàn)榧虞d網(wǎng)頁(yè)時(shí)下載圖片導(dǎo)致,具體原因還需要詳細(xì)調(diào)查驗(yàn)證拯辙。
參考資料:
you-get github
pip
Splinter
linux無(wú)界面(headless)使用selenium抓取數(shù)據(jù)