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小技巧:這17個騷操作你都OK嗎?
※你猜猜看,這次的文章內容是什麼?猜對有獎!
TAG:python |