手把手教你如何使用Python執行js程式碼

2020-08-12 14:39:39

前言

    各位小夥伴,大家好,這次咱們來說一下關於爬蟲方向的一個知識,Python如何執行js,快來看看吧!!!

 

爲什麼要引出Python執行js這個問題?

    都說術業有專攻,每個語言也都有自己的長處和短處。在爬蟲方向,Python絕對是扛把子,近幾年隨着AI的火爆,需要各種各樣的數據,所以,爬蟲需求也跟着水漲船高起來。

    我們做爬蟲的當然是爬的爽,但是估計人家後臺在罵街,畢竟誰都不希望自己的數據被弄走,所以後台反爬技術也在快速提升,一攻一防就這麼在拉鋸着。

    現在爲了防止反爬,前端使用的反爬技術比較多的是js程式碼混淆。

 

什麼是js程式碼混淆?

正常程式碼

    我們現在看一段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;}

    

    執行一下這段程式碼,如下圖所示。

混淆程式碼

我隨便找了個線上的js程式碼混淆網站。

js程式碼

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程式碼都成這玩意了,還能執行嗎? 答案是肯定的。即使js程式碼非常亂,但還是可以執行的,結果跟上面的是一樣的。

    這就造成了一個問題,我們在做爬蟲時,如果需要,多多少少可能都要研究一下js程式碼,然後進行js解密一下,但是,但是,要是程式碼都混淆成了這了,還怎麼解?

    一點邏輯都看不通了,基本上不可用Python按照js邏輯重寫出來了...

    很巧,小編也是卡在這裏...後來我就想,要是Python能執行js程式碼就好了,不用管函數裏面的邏輯了,只拿函數返回值就好了。

 

Python第三方包Execjs

    可能是吧,不止我一個人遇到了這種情況,所以大佬們就開發出來這種工具包,用於執行js程式碼。

 

安裝

    在安裝之前,需要有node環境,這裏就不舉栗子了,下一步下一步就好了。

pip3 install PyExecJS

Execjs用法超級簡單的,幾行程式碼。

 

執行js

注:由於上述js程式碼會生成window物件,並不能直接執行成功,需要額外的其他輔助,這裏簡單的舉一下其他例子。

 

正常js程式碼

function add(x, y) {   return x + y;}

 

Python執行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執行混淆js程式碼
import execjs
ctx = execjs.compile("""function add(bi1,Pl$2){return bi1+Pl$2}""")print(ctx.call("add", 1, 2))

執行結果如下圖所示:

    可以看到,即使再混淆,只要執行的是js程式碼,都是沒啥問題的。

    上述拼接時間返回的js混淆程式碼也是可以執行的,但是它多了一個window物件,需要node安裝jsdom才行,由於網路設定有問題,實在是下載不了舉例子,實在是抱歉。

    或者使用selenium開啓遊覽器執行再返回也行,當然,速度更慢。