反爬蟲與反反爬蟲從爬蟲誕生開始就已經(jīng)存在,反爬策略層出不窮,反反爬也都應(yīng)對有招。
就我目前碰到的反爬,從簡單的user-agent,ajax,封ip,到限制賬號訪問頻率,驗(yàn)證碼,加密參數(shù)等。這些都是非常常見的反爬,相信大家基本上都碰到過,除此之外,也有一些調(diào)皮的網(wǎng)站會有一些有特色的反爬,比如某個招聘網(wǎng)站,網(wǎng)頁元素審查看到的標(biāo)簽排版及一些屬性與網(wǎng)頁源碼有點(diǎn)出入,通過js對網(wǎng)頁標(biāo)簽進(jìn)行了改動(這里并不是指的ajax加載新內(nèi)容),對于一些接觸爬蟲不久的朋友,可能會死磕在這里,用bs/xpath怎么死都取不出對應(yīng)的內(nèi)容呢,因?yàn)樗麄円恢痹趂12元素審查,那并不是源碼的真實(shí)面目。以上這個例子,來自我的一個爬蟲初學(xué)者朋友。還有很多有趣的反爬,比如以下這個。。。。
這是我今天在一個群里面看到的哈哈。
對反爬蟲與反反爬蟲的恩怨情仇感到有興趣的,推薦看這篇文章,或許你已經(jīng)看過了:干貨 | 那些你不知道的爬蟲反爬蟲套路
在tg上一個python爬蟲群里面,有個群友讓我?guī)兔饷芤粋€網(wǎng)站的加密參數(shù),當(dāng)時記著了,現(xiàn)在考完有時間就看了看。
這個網(wǎng)站是一個快手火山抖音小視頻合集網(wǎng)站,網(wǎng)站鏈接在這:
https://kuaiyinshi.com/
這個網(wǎng)站有一個接口,可以獲取隨機(jī)一個(我也不知道是什么規(guī)則,姑且稱為隨機(jī))小視頻的內(nèi)容包括評論等等:
https://kuaiyinshi.com/api/dou-yin/recommend/
可以從這個接口中獲得一個視頻的url,比如:
//aweme.snssdk.com/aweme/v1/play/?video_id=:117:150:176:161:188:157:125:184:137:98:176:123:117:102:131:159:122:99:128:161:141:203:128:137:190:147:130:166:163:152:134:203&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0
但事實(shí)上,直接用這個鏈接是獲取不到視頻的,通過抓包發(fā)現(xiàn),真正的視頻鏈接是以下這個:
//aweme.snssdk.com/aweme/v1/play/?video_id=4fc7b70d02b7436593373e35ec4bbe9a&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0
通過對比可以看出,video_id參數(shù)的值i發(fā)生了改變,由:117:150:176:161:188:157:125:184:137:98:176:123:117:102:131:159:122:99:128:161:141:203:128:137:190:147:130:166:163:152:134:203變?yōu)榱?fc7b70d02b7436593373e35ec4bbe9a
需要找到這個加密方法。
以下講講步驟
首先,肯定是打開網(wǎng)頁開發(fā)者工具,刷新網(wǎng)頁,抓包,分析抓到的http包內(nèi)容。
然后,肯定是,ctrl+shit+F,全局搜索,搜索關(guān)鍵字:video_id。
可以看到,由兩個js文件中出現(xiàn)了video_id。
分別為:
https://kys.tqdn.cn/js/main.js?t=1530178376 ? ?
https://kys.tqdn.cn/js/public.js?t=1529140999 ? ?
其中main.js如下:
太亂了,js代碼就和毛線球一樣,愿意的話,可以把它扯亂成一團(tuán),然后讓你去把它理清。很顯然,為了反爬,這個網(wǎng)站就是這樣做的。
但不管怎么說,還得繼續(xù)。
把它們?nèi)繌?fù)制出來,然后找個在線格式化js代碼的網(wǎng)頁小工具。得到如下格式化代碼:
另外一個js文件也是這樣。
然后再定位video_id在這兩個js文件中的位置,觀察一下發(fā)現(xiàn),public.js中的video_id和加密方法無關(guān)系
在一個judgeSource的函數(shù)里面,大概可以看出是判斷視頻為抖音還是快手抑或是火山的一個函數(shù)。
所以只需觀察main.js文件,大概長這個樣子:
是不是很崩潰。。。
先定位下video_id在這個文件中的位置:
看到這第一個變量?__Ox1169c就大概明白了,原來這個文件把一些關(guān)鍵字詞全部讓這個__Ox1169c數(shù)組元素代替了,所以這個js文件才看起來那么讓人發(fā)慌。
到這里其實(shí)考驗(yàn)的就是耐心了,一縷縷的把代碼過一遍就行。
我們先看這些函數(shù)名字,發(fā)現(xiàn)都很有規(guī)律的,比如說,我們看到一個creatplay函數(shù),猜也能猜出它的作用吧。在控制臺試一下就知道了:
發(fā)現(xiàn)一回車,視頻便換了一個,ok這個函數(shù)肯定和加密video_id有關(guān),我們以這個函數(shù)為入口開始看。
看第一個 var _ =??__Ox1169c[94];
我們可以在控制臺輸入?__Ox1169c[94] 回車,很方便的查看 __Ox1169c[94]的值
按照這個方法,一個個把它還原成成直觀的js代碼,大致理解。
最后定位到這里:
發(fā)現(xiàn) ab3d7fc 這個函數(shù)就是加密方法,ok到此為止,繼續(xù)看?ab3d7fc 這個函數(shù)。
這個函數(shù)的兩個參數(shù),一個是video_id,一個是ky,ky在控制臺輸入也可獲得。
將 ab3d7fc 這個函數(shù),還原成本來的js代碼:
這個時候,可以選擇用execjs來執(zhí)行這段js,或者把它換成python方法。
到此,成功獲取了這個網(wǎng)站js加密參數(shù)的加密方法。
想爬抖音視頻,卻不知道抖音的app內(nèi)加密參數(shù),又不會逆向,除了分享鏈接接口的方法,這個網(wǎng)站上的抖音視頻也很好爬。