簡單js反爬小練習-python爬蟲

原文:http://m.itdecent.cn/p/1114f9f4b6db

眾所周知,在數(shù)據(jù)抓取的道路上,javascript是一個繞不開的坎。非常復雜的js反爬技巧如極驗,這個實際上也是可以破解的,業(yè)界也有現(xiàn)成產(chǎn)品了。
本篇文章,我們便是從一個非常簡單的js反爬腳本著手,粗淺得介紹一種簡單的反爬手段,以及我們?nèi)绾吾槍@種情況進行破解。

首先,我們來看這么一段程序,它是get請求中獲取到頁面源碼的一部分。

var s = '1.41.601'.split('').reverse().join('');
var yy = atob('\x4d\x69\x34\x79\x4e\x44\x41\x3d'.replace(/\\x([0-9A-Fa-f]{2})/g,
    function() {
        return String.fromCharCode(parseInt(arguments[1], 16))
    }));
var pp = -3983 + 12065;
document.write('<a href="/' + s + yy + '/' + pp + '#http">' + s + yy + String.fromCharCode(58) + pp + '</a>');

這是一串非常簡單的js代碼,其作用就是拼裝IP+port,作為超鏈接輸出到網(wǎng)頁上。
頁面上的顯示效果如下

<a href="/106.14.12.240/8082#http">106.14.12.240:8082</a>

常規(guī)的get請求是無法直接獲取到這段ip地址的,而只能獲取其對應(yīng)的js源碼。這便是js反爬的一種手段,一種非常初級的手段,但不可否認,它確實起到了反爬的作用。

有了上述源碼和頁面顯示的對比,相信大家對這段代碼的功能一定有了直觀的認識。

而反爬破解,就這個頁面來說,就是解析這段js代碼的功能,并用python實現(xiàn),從而根據(jù)頁面上的源碼,獲取到我們想要的數(shù)據(jù),也就是這個IP+PORT。

接下來我們便從代碼層面一句一句解析這段js程序,并用python實現(xiàn)。

首先,第一行程序,各位看到reverse,再對比一下輸出效果,業(yè)務(wù)功能便呼之即出了,因而我們的問題只兩個,其一如何獲取到原始文本,其二,python代碼如何實現(xiàn)。關(guān)于問題一,用正則,問題二,字符串反轉(zhuǎn)在python里面的實現(xiàn)非常之簡單。代碼如下

ip_part1 = re.search(r'\'(.*)\'\.split', page_content).group(1)[::-1]

當然,這個正則可以有多種寫法,考慮到篇幅以及博主的功力,此處就不深入展開了。而字符串反轉(zhuǎn),一個切片即可搞定,大家若想深入,可自行度娘或者谷哥。

接著我們來看這第二段代碼,這里出現(xiàn)了2個自帶函數(shù),一個是atob(解析base64的字符串),而另一個則是replace(搭配 /XXX/g 就是js里面的正則替換功能)。

String.fromCharCode(parseInt(arguments[1], 16))如字面,即獲取16進制數(shù)字,然后轉(zhuǎn)換成對應(yīng)ascii碼的字符。

整體看下來,這段代碼的意思就是通過正則截取源字符串的16進制數(shù)字,轉(zhuǎn)換成對應(yīng)的base64字符串,然后利用atob轉(zhuǎn)換成utf-8編碼格式的字符串。
ok,有了業(yè)務(wù)功能,那么python代碼的實現(xiàn)也就簡單了,實現(xiàn)如下

ip_part2= ''.join([chr(int(x, 16)) for x in re.findall(r'\\x([0-9A-Fa-f]{2})', page_content)])

難點部分已然解析完成,剩下一個pp,這個就不多說了,兩個數(shù)字的運算結(jié)果就是端口號,大家請自己動手,我就不贅述了。

整個小練習到此也就告一段落了,不知不覺中,各位已經(jīng)跟著博主完成了一次小小的反爬破解。本質(zhì)上來講,破解反爬就是要讀懂反爬工程師的思路。

破解方式多種多樣,而需要我們考慮,或者說權(quán)衡的核心要素在博主看來有兩點
其一,破解實現(xiàn)是否是程序運行效率上的最優(yōu)解。
其二,破解反爬的耗時是否在項目可承受范圍內(nèi)。

有時候,我們需要靜下心來好好搞破解,而有時候,直接用selenium這類自動化工具也未嘗不可。

轉(zhuǎn)載請注明出處,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容