本文轉自蔡老闆的公衆號,原網址:https://mp.weixin.qq.com/s/NjWXail0y3vdqZJPLgjTfgjavascript
AST從入門到實戰系列基礎文章索引: AST在線解析網站: 原站點: AST explorer 國內鏡像 AST explorercss
答:在計算機科學中,抽象語法樹(Abstract Syntax Tree,AST),或簡稱語法樹(Syntax tree),是源代碼語法結構的一種抽象表示。html
它以樹狀的形式表現編程語言的語法結構,樹上的每一個節點都表示源代碼中的一種結構。前端
之因此說語法是「抽象」的,是由於這裏的語法並不會表示出真實語法中出現的每一個細節。(摘自百度百科)java
關鍵詞:源代碼,樹,語法,抽象。node
既然是一棵樹,那確定有節點,或者遍歷相關的概念。git
答:隨着技術的革新,愈來愈多的前端爲了保護其網站不被第三方爬取,使用了大量的混淆代碼,讓爬蟲工程師愈來愈難找到其核心參數加密代碼。github
有時候定位到加密的地方,面對一大坨亂如麻的代碼,心裏也是拒絕的。npm
這個時候,但願有一種工具,儘量的將被混淆的代碼進行處理,使其可讀性大大增長,使爬蟲工程師可以垂手可得的進行定位,摳出其核心的加密代碼。編程
AST用在這裏,只是一種輔助工具,並不能直接幫你找到核心的代碼,仍是得本身去分析,靜態分析也好,動態調試也好,目的只有一個。
答:學習《編譯原理》能更容易理解AST,不過沒學也不要緊。在這裏,咱們當它是一個工具,能夠將代碼進行簡化就行。
目前,前端基本都使用的是JavaScript語言,因此你須要有JavaScript語言的基礎,這也是作爬蟲工程師必備的技能。
這裏推薦一個入門的javascript教程,很是適合零基礎的小白。
https://wangdoc.com/javascript/index.html
作爬蟲的工程師都或多或少的聽過Node.js,把它理解爲運行在服務端的 JavaScript 就好。有時候摳出來的核心代碼比較複雜,沒法改寫成Python語言,而又須要對相關參數進行加密並返回給Python,這時候Node.js就派上用場了。
在線下載網站:
https://nodejs.org/zh-cn/
這裏我的推薦使用長期支持的版本,比較穩定。
而在Node.js下,有關AST的庫不少,本人使用的是babel庫,其餘的庫沒作了解,babel庫簡單,功能強大是它的特色。
在下載並安裝後Node.js,就能夠直接安裝 babel庫了。
安裝命令:
npm install @babel/core --save-dev
注意: 不要全局安裝,可能會有沒法導入庫的狀況。
答:有一個在線的解析網站:
https://astexplorer.net/
該網站能夠清晰的將源代碼解析成AST,能夠將多種語言解析成AST,這裏咱們須要處理的是JavaScript,所以選擇這個就好:
語言選擇後,再選擇相應的庫,這裏注意了,在Node.js下安裝的是babel庫,所以這裏選擇 @babel/parser ,保持一致。
答:首先要明確的是,你要作什麼。好比看到源代碼中,有不少相似這樣的代碼:
var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";
這代碼看起來,可讀性就差了不少,若是不是特別記憶,根本看不出是什麼字符。
這個時候,你想把它還原成原本的面目:
var a = "hello,AST";
這樣對你來講,就清晰多了。這時,你的目的就出來了,想要將
"\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054"
替換成:
"hello,AST"
在這裏,咱們手動替換就行了。那若是代碼中有大量這樣的字符串呢?也是一個一個手動替換嗎?
因此,聰明的你確定選擇用工具來完成這個重複的工做。
目的明確了,如今就是如何編寫工具了。
將
var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";
放在在線網站進行解析,發現要處理的字符串是一個 StringLiteral 類型的節點:
在使用babel庫操做時,只需遍歷這個類型的節點,就會處理所有的 StringLiteral節點。
要處理節點,那確定要理解babel庫的相關知識。
1.babel庫官方文檔:
https://babeljs.io/docs/en/
2.babel庫github地址:
https://github.com/babel/babel
3.babel庫官方插件開發手冊:
https://github.com/jamiebuilds/babel-handbook
4.babel庫官方插件
https://www.babeljs.cn/docs/plugins
答:我的不是很推薦WebStrom,感受太笨重了,還要購買。這裏推薦微軟出品的 VS code,輕便好用。
若是不是很想裝軟件,也能夠試試我一直在用的套裝:
UltraEdit 編輯器 + Cmder + Node.js
開發完成後,將文件保存爲 xxx.js,再在Cmder下輸入命令:
node xxx.js