python使用js2py庫運行js代碼
在日常使用Python做爬蟲,一般會用到以下手段:
- 請求URL,返回HTML文本,然后通過xpath、css或者re,提取數(shù)據(jù)
- 有些網(wǎng)頁的數(shù)據(jù)通過AJAX異步請求加載,此時找到對應(yīng)的接口,調(diào)用并直接使用接口返回的數(shù)據(jù)
- 有時候如果網(wǎng)站反爬或安全機(jī)制比較高時,則會做一些驗證或者加密,比如cookie內(nèi)必須攜帶token等信息,而這些信息是通過混淆過的js代碼計算得出的。
針對1,應(yīng)該是爬取大多數(shù)沒有任何安全機(jī)制并且是靜態(tài)網(wǎng)頁時,常用手段,而2是提取數(shù)據(jù)最為快速的,但是接口并不是總是返回我們最喜歡的json字符串,有可能是一段js代碼定義的變量數(shù)據(jù),針對3則更為頭痛,如果在Python匯總能運行js代碼,則可能會解決掉我們大部分的煩惱,本文即講解一個Python包,用于直接在Python代碼中直接運行js代碼,然后得到我們感興趣的函數(shù)、數(shù)據(jù)或者js代碼運行之后的結(jié)果。
一、js2py庫概述
js2py是眾多可以在Python中運行js代碼比較優(yōu)秀的庫。
安裝js2py方法如下:
pip install js2py
js2py中有以下兩個比較關(guān)鍵的方法:
方法 | 解釋 | 示意 |
js2py.eval_js(js_string) | 直接運行含有js代碼的字符串(或js文件),并得出結(jié)果 | js_string='var a=10' js2py.eval_js(js_string) #輸出10 |
js2py.EvalJs() | 生成一個EvalJs對象 可通過該對象的execute方法來運行一段js代碼(或js文件),并得到對應(yīng)的變量和對象(即抑制輸出,得到變量和對象,便于后續(xù)直接使用) 可通過該對象的eval()方法來運行一段js代碼,并得到結(jié)果 | js_string='var a=10' js_obj=js2py.EvalJs() js_obj.execute(js_string) js_obj.a #輸出為10 |
二、抽取js代碼運行結(jié)果
import js2py string='var db={chars:["a","b","c","d","f","g","h","j","k","m","n","p","q","r","s","t","w","x","y","z"],datas:[["005970","國泰消費優(yōu)選股票","GTXFYXGP","1.9082","1.9082","1.8657","1.8657","0.0425","2.28","開放申購","開放贖回","","1","0","1","","1","0.15%","0.15%","1","1.50%"],["004069","南方中證全指證券公司ETF聯(lián)接A","NFZZQZZQGSETFLJA","1.1438","1.1438","1.1212","1.1212","0.0226","2.02","開放申購","開放贖回","","1","0","2","","1","0.12%","0.12%","1","1.20%"]],count:["9981","3745","1653","4583"],record:"10481",pages:"5241",curpage:"1",indexsy:[-0.04,-0.34,-0.03,],showday:["2021-03-05","2021-03-04"]}' mydict=js2py.eval_js(string) #最后會將string內(nèi)定義的對象,變?yōu)镻ython字典并賦值給mydict string=''' function add(a, b) { return a + b } ''' myadd=js2py.eval_js(string) #會得到一個add函數(shù)并賦值給myadd,后續(xù)可通過myadd直接調(diào)用
- 以上第一個string,便是作者在爬取天天基金的基金數(shù)據(jù)時,發(fā)現(xiàn)該網(wǎng)站接口返回的基本都是一個js語句,在該語句內(nèi)定義了返回的數(shù)據(jù),當(dāng)然,如果不通過js2py,也可以將該string通過Python的eval或者exec最終解析成Python字典,但比較繁瑣(大概思路即使用字符串方法,將無用的字符刪除掉,然后將字符串變成一個Python字典的定義格式,最后運行eval或者exec函數(shù)即可)
- 以上第二個string,即一個字符串,該字符串內(nèi)定義了一個js函數(shù),此時便可以得到該函數(shù)并賦值給Python變量,后續(xù)便可以通過該變量調(diào)用該函數(shù),并且好像是該函數(shù)是在Python內(nèi)部定義的一樣
三、提取js語句內(nèi)變量和對象等
import js2py js_obj=js2py.EvalJs() string=''' var a=10 function func(a,b){ return a*b } ''' js_obj.execute(string) js_obj.a #輸出為10 js_obj.func #為func函數(shù) js_obj.func(3,4) #輸出為12
以上示意,變得更有意思,可以通過execute方法,運行下js代碼,先不輸出結(jié)果,而是得到這里面定義的變量、函數(shù)等,然后把這些作為屬性附加給js_obj對象,后續(xù)便可以通過該對象訪問到這些屬性,這樣會更加直觀和靈活,好像是直接在Python中寫js代碼一樣
四、其他
當(dāng)然,Python還有其他運行js代碼的庫,但是作者感覺js2py整體是最契合Python的,甚至語法都基本沒什么變化,故推薦使用該庫
該庫還有其他很多方法和用途,不過以上是最為常用的場景,讀者如果需要或感興趣,可以進(jìn)一步研究學(xué)習(xí),不顧如果能掌握好以上方法,基本可以滿足90%的日常需要了。
到此這篇關(guān)于python使用js2py庫運行js代碼的文章就介紹到這了,更多相關(guān)python 運行js代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python檢測lvs real server狀態(tài)
這篇文章主要介紹了用python檢測lvs real server狀態(tài)的示例,大家參考使用吧2014-01-01Python 12306搶火車票腳本 Python京東搶手機(jī)腳本
這篇文章主要為大家詳細(xì)介紹了Python 12306搶火車票腳本和Python京東搶手機(jī)腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Python+wxPython實現(xiàn)一個簡單的音樂播放器
這篇文章主要為大家詳細(xì)介紹了如何使用Python編程語言和wxPython模塊創(chuàng)建一個簡單的音樂播放器,文中的示例代碼講解詳細(xì),感興趣的可以了解下2023-09-09Pytorch出現(xiàn)錯誤Attribute?Error:module?‘torch‘?has?no?attrib
這篇文章主要給大家介紹了關(guān)于Pytorch出現(xiàn)錯誤Attribute?Error:module?‘torch‘?has?no?attribute?'_six'解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11python 常用日期處理-- datetime 模塊的使用
這篇文章主要介紹了python 如何對日期進(jìn)行處理,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09使用Python實現(xiàn)windows下的抓包與解析
這篇文章主要介紹了使用Python實現(xiàn)windows下的抓包與解析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-01-01