當前位置:
首頁 > 知識 > Python爬取視頻之日本愛情電影

Python爬取視頻之日本愛情電影

肉身翻牆後,感受一下外面的骯髒世界。牆內的朋友叫苦不迭,由於某些原因,VPN能用的越來越少。上周我的好朋友狗子和我哭訴說自己常用的一個VPN終於也壽終正寢了,要和眾多的日本小姐姐說再見了。作為「外面人」,我還是要幫他一把……

初探

狗子給我的網站還算良心,只跳了五個彈窗就消停了。

然後看到的就是各種穿不起衣服的女生的賣慘視頻,我趕緊閉上眼睛,默念了幾句我佛慈悲。

Tokyo真的有那麼hot?

給狗子發了一張大的截圖,狗子用塗鴉給我圈出了其中一個。

我和狗子說「等著吧」

(放心網站截圖我是打了碼也不敢放的。。。)

點進去之後,可以在線播放。

右下角有一個 Download 按鈕,點擊之後需要註冊付費。

當時我就火了,這種賣慘視頻毒害我兄弟精神,還敢收錢?!

自己動手,豐衣足食!

環境 & 依賴

Win10 64bit

IDE: PyCharm

Python 3.6

python-site-packegs: requests + BeautifulSoup + lxml + re + m3u8

在已經安裝pip的環境下均可直接命令行安裝

網站解析

將鏈接複製到Chrome瀏覽器打開

(我平時用獵豹,也是Chrome內核,界面比較舒服,但是這個時候必須大喊一聲谷歌大法好)

菜單——更多工具——開發者選項(或者快捷鍵F12)進入Chrome內置的開發者模式

大概界面是這樣

(唉打碼真的累。。。。)

然後,根據提示,逐層深入標籤找到視頻所在具體位置

這個網站存放的位置是 …->flash->video_container->video-player

顯然視頻就放在這個這個video-player中

在這個標籤中,有一個名字為 source 的鏈接,src=」http://#%@就不告訴你#@¥」

Easy好吧!

這點小把戲還難得到我?我已經準備和狗子要紅包了

複製該鏈接到地址欄粘貼並轉到,然後,神奇的一幕出現了!!

What???

這是什麼???

為啥這麼小???

科普概念如上,那也就是說,m3u8記錄了真實的視頻所在的地址。

Network Traffic

想要從源碼直接獲得真實下載地址怕是行不通了。

這時候再和我一起讀「谷歌大法好!」

很簡單,瀏覽器在伺服器中Get到視頻呈現到我們面前,那這個過程必定經過了解析這一步。

那我們也可以利用瀏覽器這個功能來進行解析

依舊在開發者模式,最上面一行的導航欄,剛剛我們在Elements選項卡,現在切換到Network

我們監聽視頻播放的時候的封包應該就可以得到真實的視頻地址了,試試看!

我們驚喜的發現,一個又一個的 .ts 文件正在載入了

(如果在圖片里發現任何url請友情提醒我謝謝不然怕是水表難保)

知識點!這都是知識點!(敲黑板!)

點開其中的一個.ts文件看一下

這裡可以看到請求頭,雖然url被我走心的碼掉了,但這就是真實的視頻地址了

複製這個URL到地址欄,下載

9s。。。。。

每一個小視頻只有9s,難道要一個又一個的去複製嗎?

視頻片段爬取

答案是當然不用。

這裡我們要請出網路數據採集界的裝逼王:Python爬蟲!!!

首先進行初始化,包括路徑設置,請求頭的偽裝等。

採集部分主要是將requests的get方法放到了for循環當中

這樣做可行的原因在於,在Network監聽的圖中我們可以看到.ts文件的命名是具有規律的 seg-i-v1-a1,將i作為循環數

那麼問題又來了,我怎麼知道循環什麼時候結束呢?也就是說我怎麼知道i的大小呢?

等等,我好像記得在視頻播放的框框右下角有時間來著?

在開發者模式中再次回到Element選項卡,定位到視頻框右下角的時間,標籤為duration,這裡的時間格式是 時:分:秒格式的,我們可以計算得到總時長的秒數

但是呢,這樣需要我們先獲取這個時間,然後再進行字元串的拆解,再進行數學運算,太複雜了吧,狗子已經在微信催我了

Ctrl+F全局搜索duration

Yes!!!

好了,可以點擊運行然後去喝杯咖啡,哦不,我喜歡喝茶。

一杯茶的功夫,回來之後已經下載完成。我打開文件夾check一下,發現從編號312之後的clip都是只有573位元組,打開播放的話,顯示的是數據損壞。

沒關係,從312開始繼續下載吧。然而下載得到的結果還是一樣的573位元組,而且下了兩百多個之後出現了拒絕訪問錯誤。

動態代理

顯然我的IP被封了。之前的多個小項目,或是因為網站防護不夠嚴格,或是因為數據條目數量較少,一直沒有遇到過這種情況,這次的數據量增加,面對這種情況採取兩種措施,一種是休眠策略,另一種是動態代理。現在我的IP已經被封了,所以休眠也為時已晚,必須採用動態IP了。

主要代碼如下所示

合併文件

然後,我們得到了幾百個9s的.ts小視頻

然後,在cmd命令行下,我們進入到這些小視頻所在的路徑

執行

copy/b %s*.ts %s
ew.ts

很快,我們就得到了合成好的視頻文件

當然這個前提是這幾百個.ts文件是按順序排列好的。

成果如下

優化—調用DOS命令 + 解析m3u8

為了儘可能的減少人的操作,讓程序做更多的事

我們要把盡量多的操作寫在code中

引用os模塊進行文件夾切換,在程序中直接執行合併命令

並且,在判斷合併完成後,使用清除幾百個ts文件

這樣,我們運行程序後,就真的可以去喝一杯茶,回來之後看到的就是沒有任何多餘的一個完整的最終視頻

也就是說,要獲得一個完整的視頻,我們現在需要輸入視頻網頁鏈接,還需要使用chrome的network解析得到真實下載地址。第二個部分顯然不夠友好,還有提升空間。

所以第一個嘗試是,可不可以有一個工具或者一個包能嗅探到指定網頁的network traffic,因為我們剛剛已經看到真實地址其實就在requestHeader中,關鍵在於怎樣讓程序自動獲取。

查閱資料後,嘗試了Selenium + PhantomJS的組合模擬瀏覽器訪問,用一個叫做browsermobProxy的工具嗅探保存HAR(HTTP archive)。在這個上面花費了不少時間,但是關於browsermobProxy的資料實在是太少了,即使是在google上,搜到的也都是基於java的一些資料,面向的python的API也是很久沒有更新維護了。此路不通。

在放棄之前,我又看一篇網站的源碼,再次把目光投向了m3u8,上面講到這個文件應該是包含文件真實地址的索引,索引能不能把在這上面做些文章呢?

Python不愧是萬金油語言,packages多到令人髮指,m3u8處理也是早就有熟肉。

pip install m3u8

這是一個比較小眾的包,沒有什麼手冊,只能自己讀源碼。

這個class中已經封裝好了不少可以直接供使用的數據類型,回頭抽時間可以寫一寫這個包的手冊。

現在,我們可以從requests獲取的源碼中,首先找到m3u8的下載地址,首先下載到本地,然後用m3u8包進行解析,獲取真實下載地址。

並且,解析可以得到所有地址,意味著可以省略上面的獲取duration計算碎片數目的步驟。

最終

最終,我們現在終於可以,把視頻網頁鏈接丟進url中,點擊運行,然後就可以去喝茶了。

再來總結一下實現這個的幾個關鍵點:

- 網頁解析

- m3u8解析

- 動態代理設置

- DOS命令行的調用

動手是最好的老師,尤其這種網站,兼具趣味性和挑戰性,就是身體一天不如一天。。。

完整代碼


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 python 的精彩文章:

值得收藏的Python小技巧:這17個騷操作你都OK嗎?
你猜猜看,這次的文章內容是什麼?猜對有獎!

TAG:python |