Python 動(dòng)態(tài)網(wǎng)頁(yè)抓取之提取視頻源

最近遇到一個(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)站視頻鏈接分三種情況:

  1. 電腦版網(wǎng)頁(yè)鏈接,在查看這類(lèi)網(wǎng)頁(yè)源代碼時(shí)會(huì)發(fā)現(xiàn)視頻源為flash文件屹培,無(wú)法獲取有效的視頻地址默穴,需要使用第三方庫(kù)You-Get
  2. 遺憾的是You-Get并非支持所有的視頻網(wǎng)站怔檩,對(duì)于不能支持的視頻網(wǎng)站,需要設(shè)置User-Agent模擬iPhone用戶進(jìn)行提取壁顶,或者破解其加密方式
  3. 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)題

  1. ios系統(tǒng)播放器只支持mp4和mov等少數(shù)幾種視頻格式竹勉。但是在下載的視頻中很多是flv格式飞盆,無(wú)法在系統(tǒng)播放器中播放。
  2. 手機(jī)中分享來(lái)的視頻網(wǎng)址無(wú)法使用You-Get提取視頻次乓。
  3. 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

image

以及網(wǎng)頁(yè)源代碼

image

圖中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

安裝firefoxselenium

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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郭变,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涯保,更是在濱河造成了極大的恐慌诉濒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夕春,死亡現(xiàn)場(chǎng)離奇詭異未荒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)及志,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)片排,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寨腔,“玉大人,你說(shuō)我怎么就攤上這事率寡∑嚷” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冶共,是天一觀的道長(zhǎng)乾蛤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捅僵,這世上最難降的妖魔是什么幻捏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮命咐,結(jié)果婚禮上篡九,老公的妹妹穿的比我還像新娘。我一直安慰自己醋奠,他們只是感情好榛臼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窜司,像睡著了一般沛善。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞祈,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天金刁,我揣著相機(jī)與錄音,去河邊找鬼议薪。 笑死尤蛮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斯议。 我是一名探鬼主播产捞,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哼御!你這毒婦竟也來(lái)了坯临?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恋昼,失蹤者是張志新(化名)和其女友劉穎看靠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體液肌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挟炬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辟宗。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吝秕,靈堂內(nèi)的尸體忽然破棺而出泊脐,到底是詐尸還是另有隱情,我是刑警寧澤烁峭,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布容客,位于F島的核電站,受9級(jí)特大地震影響约郁,放射性物質(zhì)發(fā)生泄漏缩挑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一鬓梅、第九天 我趴在偏房一處隱蔽的房頂上張望供置。 院中可真熱鬧,春花似錦绽快、人聲如沸芥丧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)续担。三九已至,卻和暖如春活孩,著一層夾襖步出監(jiān)牢的瞬間物遇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工憾儒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留询兴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓起趾,卻偏偏與公主長(zhǎng)得像蕉朵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阳掐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)始衅、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評(píng)論 4 62
  • 用到的組件 1缭保、通過(guò)CocoaPods安裝 2汛闸、第三方類(lèi)庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,613評(píng)論 1 180
  • 好久沒(méi)出差了艺骂,3月17日突然接到通知诸老,告知20日要到上電技培中心參加培訓(xùn)師學(xué)習(xí),當(dāng)時(shí)心里一緊钳恕、感覺(jué)好突然别伏,連忙探...
    上海電力王青元閱讀 261評(píng)論 0 0
  • 項(xiàng)目簡(jiǎn)介: 我們做什么? 我們做以小區(qū)為定位的小區(qū)拼團(tuán)平臺(tái),輻射周邊1公理 我們什么做? 分2步走: 1:做”京東...
    c99a0e805927閱讀 2,452評(píng)論 0 0
  • 與書(shū)共寢蹄衷,安詳自在。下班回家厘肮,累了坐在床上愧口,隨意拿本書(shū)來(lái)讀,讀累了放下書(shū)类茂,安寢耍属!第二天到自然醒,繼續(xù)昨天的書(shū)看巩检!偶...
    霸王東渡閱讀 246評(píng)論 0 4