動態內容_如何使用PyV8取得

由於環境上的需求,上一次在安裝PyV8之後,
整個Python版本都重新安裝了!

本篇內容在回復環境後,
就正式進入重頭戲(做了那麼多前置作業就是為了拿URL啊!!)
行進方向為->PyV8使用->觀察原js檔->實際取得URL

回復先前環境
從pip開始,再照著之前需要的模組重新下載。

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

在我使用pip install jupyter的時候
下載了jupyter1.0.0 (不知道這是不是只支援Py3.4)

總之 後來就出現缺少MS SDK的報錯
遵照指示去了網址
下載套件
發現要花很久時間,還很佔空間ˊ~ˋ
據說有其他版本的visual studio只要環境變數設置完還是可以替代的...

去網路上查了發現有不少其他解法:

A.
       Download numpy
       Python setup.py build
       Python setup.py install


B.
       pip install ephem
(我先前CMD回報紀錄有看到需求ephem34,直覺告訴我攪和下去會沒完沒了
永無止境的版本問題,良心建議還是乖乖用2.7比較划算)

總之其他必要的模組安裝完畢之後,
我決定先往下進行。

好了!終於要開始使用PyV8!

現在有點小激動(肚子好餓


前言
基本上PyV8是將V8C++模組裡用boost轉接python進而成為python模組
Boost python教學: http://edyfox.codecarver.org/html/boost_python.html
native導出-->_PyV8.pyd,被import-->再包裝PyV8.py -->開始使用
-------------------------------------------------------------------------------------

所以接下來,就來研究V8有哪些東西(API)可以用

V8 引擎要怎麼用?   原文參考來源

  1. Context :

你可以把 context 當成一個 Instance,裡面有包含原始的 object , properties 等,簡單的說, context 預設就像是 Javasceipt 的 window , 當 JS 直接對外部變數修改,而沒有宣告 local variable ,這時 context 的內容就會被更改,每個 Context 都要有一個 context scope ,就是為了 Garbage 管理 ,在之後的 v8 engine 語法中,常會見到 scope 這個名稱,幾乎所有的 v8 engine object ,都必需存放在scope中。
(宣告的時候也使用了Persistent-->
  1. Persistent<Context> context;
  2. context = Context::New();
)

  1. Handle :

Handle是各種物件的reference,有自動的 GC (Garbage Collector) 處理,在 Google V8 Engine中,幾乎所有的變數都會宣告在 Handle裡,統一由Handle來管理。Handle 又分兩種類型, Local 與 Persistent ,這兩個其實也不難, Local Handle 的生命週期是由 HandleScope來控制,當變數不再被使用的時候,就會自動被GC給處理掉,Persistent Handle則是由工程師可自已控制,當不需要使用時,要手動 delete memory allocate 。(Persistent表示持續、堅持,有持續存在之意-->所以是由使用者來管理他,也就是只要使用者保留他,他就能一直存在。)

  1. HandelScope :

HandleScope 就是代表著 Handle 存在的區域,也可以說是 Handle的家,你必需先建立 HandleScope ,接著才能建立 Handle,不然 Handle可是會找不到家的喔。HandleScope 會自動管理 Handle的生命週期,當HandleScope結束掉,家裡所有的 Handle 也會被清空。

  • 同時宣告兩個以上的 HandleScope , 後面的HandleScope取代第一個HandleScope的所有功能,等於 Handle 有了兩個家,這時只要有一個 HandleScope存在, Handle就不會被清除。



        也就是在使用時,需要先new一個實例context代表這個環境本體,(也就記錄了環境與變動),接著為了更好管理環境裡物件的變化生命周期等,我們需要建立handle,然後管理handle的就是handelscope,作為handle的家來使用。

-------------------------------------------------------------------------------------

再回來看PyV8 :  參考

  1. JSContext就是v8::Context的一个wrapper,代表一个js運行環境。

  2. 基本使用

Function .enter() 先進入
Function .eval (評估 賦值cntent)如右圖-->可以將.JS內容直接傳入      
     A.
txt=open('jshello.js','r').read()
func = ctxt.eval(txt) 
     B.
func = ctxt.eval("""( function(){ 'there' } )""")ctxt.eval("""var t; function a(){ 'there' } """)Function .leave() 離開                                           http://nullege.com/codes/search/PyV8.JSContext.eval
  3. 互相調用 http://www.bkjia.com/Pythonjc/618182.html

主要是使用.locals來取出變數物件們

在python更改變數值 (可以知道是拿到變數reference)
所以可以做到變數互相調用。

了解以上用法之後再回頭看原本的需求
html->sp()->nview.js sp()->nview.js si()->pic URL更新取得


可以從原本取得的html檔發現他傳向nview.js的變數

最後的執行方程式很神祕的加密了,不過不難猜出是sp();

接著進nview.js觀察


可以看出最主要產生的部分源碼,把一些不會用到的部分拿掉,
直接把結果反傳就可以取得URL了!


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

留言

熱門文章