為什么要引出Python執(zhí)行js這個問題?
都說術(shù)業(yè)有專攻,每個語言也都有自己的長處和短處。在爬蟲方向,Python絕對是扛把子,近幾年隨著AI的火爆,需要各種各樣的數(shù)據(jù),所以,爬蟲需求也跟著水漲船高起來。
做爬蟲的當(dāng)然是爬的爽,但是估計人家后臺在罵街,畢竟誰都不希望自己的數(shù)據(jù)被弄走,所以后臺反爬技術(shù)也在快速提升,一攻一防就這么在拉鋸著。
現(xiàn)在為了防止反爬,前端使用的反爬技術(shù)比較多的是js代碼混淆。
什么是js代碼混淆?
正常代碼
我們現(xiàn)在看一段js代碼,代碼邏輯很簡單,就是拼接時間返回。
function formatDate(now) {
var now = new Date(1230999938);
var year=now.getFullYear();
var month=now.getMonth()+1;
var date=now.getDate();
var hour=now.getHours();
var minute=now.getMinutes();
var second=now.getSeconds();
return year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
}
混淆代碼
function formatDate(mz1){var KkkGDiH2=new window["\x44\x61\x74\x65"](1230999938);var tsk3=KkkGDiH2['\x67\x65\x74\x46\x75\x6c\x6c\x59\x65\x61\x72']();var YMreyP4=KkkGDiH2['\x67\x65\x74\x4d\x6f\x6e\x74\x68']()+1;var Ozo5=KkkGDiH2['\x67\x65\x74\x44\x61\x74\x65']();var QMYEc$eD6=KkkGDiH2['\x67\x65\x74\x48\x6f\x75\x72\x73']();var JfXVV_Akq7=KkkGDiH2['\x67\x65\x74\x4d\x69\x6e\x75\x74\x65\x73']();var $mP8=KkkGDiH2['\x67\x65\x74\x53\x65\x63\x6f\x6e\x64\x73']();return tsk3+"\x2d"+YMreyP4+"\x2d"+Ozo5+" "+QMYEc$eD6+"\x3a"+JfXVV_Akq7+"\x3a"+$mP8
可能我們會有個疑問,js代碼都成這玩意了,還能執(zhí)行嗎? 答案是肯定的。即使js代碼非常亂,但還是可以執(zhí)行的,結(jié)果跟上面的是一樣的。
這就造成了一個問題,我們在做爬蟲時,如果需要,多多少少可能都要研究一下js代碼,然后進(jìn)行js解密一下,但是,但是,要是代碼都混淆成了這了,還怎么解?
一點(diǎn)邏輯都看不通了,基本上不可用Python按照js邏輯重寫出來了...
后來我就想,要是Python能執(zhí)行js代碼就好了,不用管函數(shù)里面的邏輯了,只拿函數(shù)返回值就好了。
Python第三方包Execjs
安裝
在安裝之前,需要有node環(huán)境,這里就不舉栗子了,下一步下一步就好了。
pip3 install PyExecJS
Execjs用法超級簡單的,幾行代碼。
執(zhí)行js
注:由于上述js代碼會生成window對象,并不能直接執(zhí)行成功,需要額外的其他輔助,這里簡單的舉一下其他例子。
正常js代碼
function add(x, y) {
return x + y;
}
Python執(zhí)行js代碼
import execjs
ctx = execjs.compile("""
function add(x, y) {
return x + y;
}
""")
print(ctx.call("add", 1, 2))
混淆js代碼
function add(bi1,Pl$2){return bi1+Pl$2}
Python執(zhí)行混淆js代碼
import execjs
ctx = execjs.compile("""
function add(bi1,Pl$2){return bi1+Pl$2}
""")
print(ctx.call("add", 1, 2))
即使再混淆,只要執(zhí)行的是js代碼,都是沒啥問題的。
上述拼接時間返回的js混淆代碼也是可以執(zhí)行的,但是它多了一個window對象,需要node安裝jsdom才行,或者使用selenium打開游覽器執(zhí)行再返回也行,當(dāng)然,速度更慢。
審核編輯:湯梓紅
-
JS
+關(guān)注
關(guān)注
0文章
76瀏覽量
17984 -
代碼
+關(guān)注
關(guān)注
30文章
4672瀏覽量
67781 -
python
+關(guān)注
關(guān)注
53文章
4753瀏覽量
84089
發(fā)布評論請先 登錄
相關(guān)推薦
評論