爬蟲技巧-西瓜視頻MP4地址獲取

記錄一下西瓜視頻MP4地址的獲取步驟css

目標:前端

指定西瓜視頻地址,如 https://www.ixigua.com/a6562763969642103303/#mid=6602323830,獲取其視頻MP4文件的下載地址node

 

如下使用chrome瀏覽器ios

開始分析:git

首先在瀏覽器中打開視頻頁面,打開審查元素(右鍵-> 審查元素  或 F12)並刷新頁面,查看network選項中抓到的包github

技巧1:ajax

因爲咱們獲取的是視頻文件的下載地址,而視頻文件通常比較大,因此能夠在network的包列表中使用 Size 排序一下 查看最大的幾個包算法

如圖:chrome

這裏咱們很容易就能肯定視頻文件的地址 json

http://v11-tt.ixigua.com/5cc4c0ae0f7d6f87014dc0f0058157e0/5bcc7300/video/m/220f87599d445a14a53803fd01d86816e971157c7a70000cab5121742cc/

你獲得的地址和我獲得的可能不同,不過url路徑中的最後一串字符串應該是同樣的

下面咱們就要尋找這個地址是從哪裏獲取的,通常作法就是截取url中比較有表明的部分(這個看經驗,你應該懂的)來搜索,搜索可使用chrome審查元素的Search功能

這個搜索會查找network欄中全部包的響應內容,若是搜到的話,咱們就能夠肯定視頻文件地址的來源。

爲何這麼作呢?

按照正常的想法,首先這個視頻文件的獲取請求是瀏覽器發起的,那麼瀏覽器確定在發起前就獲得了視頻文件的地址,那麼地址存在什麼地方呢?通常來講,不外乎直接寫

在網頁源代碼中或者使用一個ajax請求之類的獲取一下視頻地址,因此這個地址確定存在於咱們目前所能看到的network列表中的包之中。

BUT,在這個例子中,搜索結果爲空。嘗試各類截取方法  好比 220f87599d445a14a53803fd01d86816e971157c7a70000cab5121742cc、5cc4c0ae0f7d6f87014dc0f0058157e0、v11-tt.ixigua.com

都搜索不到。

好吧,既然搜不到,那咱們就用暴力一點的辦法,好在這個網頁的network包列表並很少,咱們就一個一個找就行了,找的過程通常能夠忽略css、圖片、多媒體等文件,

優先查看json格式的文件

下面人工查看中。。。

查看一遍以後呢,我發現了一個可疑的連接

https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333&aid=1190&callback=axiosJsonpCallback1&_=1540123000124

首先,url就很可疑,裏面包含各類敏感關鍵詞,如 mp四、urls等

其次,內容可疑:

video_list都出來了,不是它還能是誰呢?可是,定睛一看,這個內容裏面的url格式不大對,一看就像是加密事後的,怪不得搜不到呢

下面就是想辦法找到解密方法,來驗證一下,這裏看到的是否是咱們想要的視頻地址了

先捋一下思路,咱們找到的這些數據是瀏覽器請求回來的,既然請求這些數據,確定會有用到的地方,下面咱們就來找一下這些數據在哪裏被使用了,怎麼找呢,仍是搜索,拿這些數據中的變量名來搜

這些數據中可疑變量有兩個:backup_url_一、main_url,第一個一看就是備用的,因此咱們拿第二個搜吧

搜索結果如圖:

下面在這些包中定位main_url所在的代碼,很幸運,第一個就是咱們想要的(tt-video.js)

如圖:

 

從代碼中咱們能夠看到,main_url使用了base64decode來進行解密,下面使用代碼驗證(這個請自行驗證)一下,果真獲得了咱們想要的視頻地址

此時,咱們已經有了從這個包中獲取視頻地址的方法了,那麼下個問題是,這個包的地址是如何生成的?

首先分析一下這個包的url的組成:

https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333&aid=1190&callback=axiosJsonpCallback1&_=1540123000124

首先去掉可有可無的參數,方法很簡單,直接在瀏覽器中打開這個url,而後嘗試刪減參數,不斷測試就能夠了,刪減後的url以下

https://ib.365yg.com/video/urls/v/1/toutiao/mp4/v02004bd0000bc9po7aj2boojm5cta5g?r=048136401358795045&s=3128215333

 而後發現,其中有三個東西不知道哪裏來的,下面繼續使用咱們的搜索工具來尋找,一個一個來。

注意:跟隨文章一步一步走的時候可能看到的參數和我這裏寫的參數不同,請按照實際的來搜索

先是 v02004bd0000bc9po7aj2boojm5cta5g,搜索結果以下:

原來這個參數是視頻的videoId,直接在網頁源碼中,好,第一個搞定

下面看第二個參數 048136401358795045  搜不到

下面看第三個參數 3128215333  搜不到

後面兩個參數都搜不到,多是實時生成的或者加密了,因此換個思路,用 url的前半部分的關鍵詞去搜 https://ib.365yg.com/video/urls/v/1/toutiao/mp4, 看那裏用到了這個

關於關鍵詞 固然是越長越準確,因此我選取的搜索詞是 video/urls/v/1/toutiao/mp4 搜索結果以下:

 

這裏只能一個一個點開看源碼了。。。

看源碼的時候注意點有如下幾個:

一、查看上下文,看所在函數做用 所在文件做用

二、思考咱們搜索的東西是什麼,好比本例中搜索的是一個視頻資源的url,那麼確定要特別關注和視頻相關的關鍵詞,函數名之類的東西

哈哈,幸運的是,在第一個文件(tt-video.js)中我就找到了很可疑的代碼

 

 這裏面全是video相關的,更可疑的是這個 getVideosJson函數名,而後我發現有個crc32函數用到了目標url,那下面就看一下crc32函數在哪裏定義的

(PS:標準crc32是一個公開算法,用於生成一段數據的校驗碼,不過通常這些反爬蟲的前端工程師們都會本身實現一下,因此仍是以JS代碼爲準)

經過搜索crc32關鍵詞,能夠定位到以下代碼:

 

重點看圖中的標紅區域,苦尋不見的 r 和 s 參數在這裏出現了,這說明咱們的思路應該是正確的,而後發現r的值是隨機生成的,這個好辦,咱們待會也隨機生成一個就行,最好徹底按照JS代碼來模擬。

可是 s 的值好像略微複雜一下,嗯,下面就是考驗你腦力的時刻了。

s的值是由函數o生成的,可是o的代碼很複雜,這個怎麼辦呢?

第一種辦法:

硬上唄,把JS代碼的算法徹底模擬了,使用別的語言嘗試計算,或者使用js引擎好比pyv8, nodejs等來執行均可以

第二種辦法:

怎麼說呢,換位思考一下,若是你是寫這段代碼的前端工程師,你會怎麼作,難道你會去從零開始實現一個校驗算法???(固然不能否認,確實有某些狀況下,算法是自創的)既然這個函數是

crc32這樣的公開算法,每種語言基本都有實現的標準庫,因此直接調用標準庫測試一下就能夠了,若是加密結果一致,皆大歡喜,不一致,請參考第一種方法。

 

ok,到目前爲止,分析已經完成了,下面就是寫代碼的時刻了。代碼以下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

代碼在哪裏?

你難道還真想要代碼?本身動手,豐衣足食!!

相關文章
相關標籤/搜索