動態內容_如何使用PyV8取得
由於環境上的需求,上一次在安裝PyV8之後,
整個Python版本都重新安裝了!
本篇內容在回復環境後,
就正式進入重頭戲(做了那麼多前置作業就是為了拿URL啊!!)
行進方向為->PyV8使用->觀察原js檔->實際取得URL
回復先前環境
從pip開始,再照著之前需要的模組重新下載。
- 安裝pip
- 下載 https://bootstrap.pypa.io/get-pip.py
- Python get-pip.py
Upgrade
- python -m pip install --upgrade pip
安裝Jupyter前先確認版本問題,
官方聲明:
Python is a requirement (Python 3.3 or greater, or Python 2.7)
Python官方手動版支援3.4
https://pypi.python.org/pypi/jupyter
https://pypi.python.org/pypi/jupyter
在我使用pip install jupyter的時候
下載了jupyter1.0.0 (不知道這是不是只支援Py3.4)
總之 後來就出現缺少MS SDK的報錯
遵照指示去了網址
下載套件
發現要花很久時間,還很佔空間ˊ~ˋ
據說有其他版本的visual studio只要環境變數設置完還是可以替代的...
據說有其他版本的visual studio只要環境變數設置完還是可以替代的...
去網路上查了發現有不少其他解法:
A.
Download numpy
Python setup.py build
Python setup.py install
Python setup.py build
Python setup.py install
B.
pip install ephem
(我先前CMD回報紀錄有看到需求ephem34,直覺告訴我攪和下去會沒完沒了
永無止境的版本問題,良心建議還是乖乖用2.7比較划算)
總之其他必要的模組安裝完畢之後,
我決定先往下進行。
好了!終於要開始使用PyV8!
現在有點小激動(肚子好餓…
前言
基本上PyV8是將V8的C++模組裡用boost轉接python進而成為python模組
Boost python教學: http://edyfox.codecarver.org/html/boost_python.html
native導出-->_PyV8.pyd,被import進-->再包裝PyV8.py -->開始使用
-------------------------------------------------------------------------------------
所以接下來,就來研究V8有哪些東西(API)可以用
V8 引擎要怎麼用? 原文參考來源
- Context :
你可以把 context 當成一個 Instance,裡面有包含原始的 object , properties 等,簡單的說, context 預設就像是 Javasceipt 的 window , 當 JS 直接對外部變數修改,而沒有宣告 local variable ,這時 context 的內容就會被更改,每個 Context 都要有一個 context scope ,就是為了 Garbage 管理 ,在之後的 v8 engine 語法中,常會見到 scope 這個名稱,幾乎所有的 v8 engine object ,都必需存放在scope中。(宣告的時候也使用了Persistent-->
)
- Persistent<Context> context;
- context = Context::New();
- Handle :
Handle是各種物件的reference,有自動的 GC (Garbage Collector) 處理,在 Google V8 Engine中,幾乎所有的變數都會宣告在 Handle裡,統一由Handle來管理。Handle 又分兩種類型, Local 與 Persistent ,這兩個其實也不難, Local Handle 的生命週期是由 HandleScope來控制,當變數不再被使用的時候,就會自動被GC給處理掉,Persistent Handle則是由工程師可自已控制,當不需要使用時,要手動 delete memory allocate 。(Persistent表示持續、堅持,有持續存在之意-->所以是由使用者來管理他,也就是只要使用者保留他,他就能一直存在。)
- HandelScope :
HandleScope 就是代表著 Handle 存在的區域,也可以說是 Handle的家,你必需先建立 HandleScope ,接著才能建立 Handle,不然 Handle可是會找不到家的喔。HandleScope 會自動管理 Handle的生命週期,當HandleScope結束掉,家裡所有的 Handle 也會被清空。
- 同時宣告兩個以上的 HandleScope , 後面的HandleScope取代第一個HandleScope的所有功能,等於 Handle 有了兩個家,這時只要有一個 HandleScope存在, Handle就不會被清除。
也就是在使用時,需要先new一個實例context代表這個環境本體,(也就記錄了環境與變動),接著為了更好管理環境裡物件的變化生命周期等,我們需要建立handle,然後管理handle的就是handelscope,作為handle的家來使用。
-------------------------------------------------------------------------------------
2. 基本使用

Function .enter() 先進入
Function .eval (評估 賦值cntent)如右圖-->可以將.JS內容直接傳入
A.
txt=open('jshello.js','r').read()
func = ctxt.eval(txt)
B.3. 互相調用 http://www.bkjia.com/Pythonjc/618182.html
func = ctxt.eval("""( function(){ 'there' } )""")ctxt.eval("""var t; function a(){ 'there' } """)Function .leave() 離開 http://nullege.com/codes/search/PyV8.JSContext.eval
主要是使用.locals來取出變數物件們
在python更改變數值 (可以知道是拿到變數reference)
所以可以做到變數互相調用。
了解以上用法之後再回頭看原本的需求
html->sp()->nview.js sp()->nview.js si()->pic URL更新取得
可以從原本取得的html檔發現他傳向nview.js的變數

最後的執行方程式很神祕的加密了,不過不難猜出是sp();
接著進nview.js觀察
可以看出最主要產生的部分源碼,把一些不會用到的部分拿掉,
直接把結果反傳就可以取得URL了!

後記: 這種文章真的能放到網路上嗎...
下一篇儲存圖片
html->sp()->nview.js sp()->nview.js si()->pic URL更新取得
可以從原本取得的html檔發現他傳向nview.js的變數

最後的執行方程式很神祕的加密了,不過不難猜出是sp();
接著進nview.js觀察
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*var ch & p 是由request網址決定的*/ | |
function ss(a,b,c,d){ | |
var e=a.substring(b,b+c);return d==null?e.replace(/[a-z]*/gi,""):e; | |
} | |
function si(c){ | |
/*感覺放上網路還是把原本格式改掉好了,總之這邊是生成圖片URL的地方*/ | |
return 'http://img'+ss(c,4,2)+'.XXX.com:00/'+ss(c,6,1)+'/'+ti+'/'+ss(c,0,4)+'/'+nn(p)+'_'+ss(c,mm(p)+10,3,f)+'.jpg'; | |
} | |
function nn(n){ | |
return n<10?'00'+n:n<100?'0'+n:n; | |
} | |
function mm(p){ | |
return (parseInt((p-1)/10)%10)+(((p-1)%10)*3) | |
}; | |
function sp(){ | |
var cc=cs.length; | |
for(var i=0;i<cc/f;i++){ | |
if(ss(cs,i*f,4)==ch) { | |
c=ss(cs,i*f,f,f); | |
ci=i; | |
break; | |
} | |
} | |
if(c==''){ | |
c=ss(cs,cc-f,f); | |
ch=chs; | |
} | |
si(c); | |
/*這邊原本還有更新頁面的其餘動作*/ | |
} | |
可以看出最主要產生的部分源碼,把一些不會用到的部分拿掉,
直接把結果反傳就可以取得URL了!

後記: 這種文章真的能放到網路上嗎...
下一篇儲存圖片
留言
張貼留言