最近、WebKitと その派生版が流行っておりまして、自分も色々と勉強中です。
で、WindowsでWebKitを扱うのに便利なライブラリは無いかしら?と思って色々と調べていました。
で、現時点で、自分が理解した事を、簡単にメモしておきます。(嘘が入っているかも知れません)
- WebKitは外部からActiveXコントロール制御できない。
どうやら商用でActiveXコントロール化した派生はあるようなんですが、WebKit自身はActiveXコントロール化されていない模様で、各種言語から CreateObject 等を使って外部から制御する事は出来ないようです。 - Windows版の内部実装は、COM実装されている模様。
少なくとも、Windows版は AcitveXの基底技術である COMで実装されています。
ただ、OLEオートメーションで必要なインタフェースを実装していないので、外部から制御できないと。 - WebKit技術を使ったライブラリは幾つかあるが、上記理由の為、実装が各ライブラリ専用に留まる。
ライブラリ毎にWebKitが小分けになっているので、C#用のライブラリをセキュリティアップデートしたからと行って、QT用のライブラリの中身が入れ替わるという事は無いようです。
イメージ的には、IEのライブラリはDLLに対するラッパー実装。WebKitのライブラリはスタティックLIB実装。って感じですかね。 - 派生ライブラリとしては、.NET用、wxWindows用、QT用、GTK用 等がある。
ちなみに、各ライブラリ共 ほぼオレAPI化されており、互換性はあまり無いと思った方が良いと思います。
(IEは、ActiveX化されているので、APIは ほぼ統一)
WebKitを調べる際、WebKitの外部制御のサンプル事例(Mac OS除く)が IEに比べて異様に少ないなぁと思ったのですが、通常だとC++言語+ソースコードを用意しないと手が出せない。各種ライブラリがオレ実装状態。じゃぁ、しょうがないなぁ。という感じですね。
上記状態からして、巷でよく見るように、WebKitとIEを比べるのは意味が無いなぁ。と感じました。
実装形態が全く違う(汎用のIE、専用のWebKit)ので、速度やセキュリティに差が出るのは当然かなぁ、という感じです。
Windowsで使えそうな派生ライブラリ
で、話を戻しまして、Windows上でWebKitエンジンを簡易に使えるライブラリとして、どんなものがあるか少し調べてみました。
ちなみに、Pythonバインディング中心です。(他の言語は、あまり勉強していないので真面目に調べていません。ははは)
1.WebKitオリジナル
C++コンパイラを用意できるなら、WebKitの本家からソースコードをダウンロードしてきて、ビルド環境を揃えて、ビルド出来たら使えます。
- The WebKit Open Source Project
http://webkit.org/
正直難易度が高いです。
2..NET用ライブラリ
WebKit.NETという.NET用のライブラリを作っている所があります。
- WebKit .NET | Home
http://webkitdotnet.sourceforge.net/ - Webkit.NETを触ってみた - SharpLab.
http://blog.sharplab.net/computer/cprograming/3247/
Windowsプログラマだったら、一番これが扱いやすいかな?と思います。
何しろ、ライブラリ一式をダウンロードした後、ファイルを展開し、アセンブリを参照して、フォームに WebKitコントロールを ぺたっと貼り付けるだけですからね。
APIも、IEを意識しているようで、かなり似せています。
3.Python用のwxWebKitライブラリ
まだプレビュー版ですが、wxWebKitというwxPythonのWebKit専用ライブラリがあります。
- wxWebKit - wxWidgets backend (and frontend) for WebKit | Main / HomePage
http://wxwebkit.wxcommunity.com/index.php?n=Main.HomePage - wxPython
http://www.wxpython.org/
おっPy派なら、多分これが扱いやすいかな?と思います。
とりあえず、Windowsインストーラー形式でライブラリが配布されているので、ぽんぽんインストールして、少しスクリプトを書くだけで使えますからね。
今回のネタは、これを使って簡易ブラウザを作っています。
4.Python用のpyWebKitGtkライブラリ
これも開発中のようですが、pyWebKitGtkというpyGTK用のライブラリがあります。
- pywebkitgtk - Project Hosting on Google Code
http://code.google.com/p/pywebkitgtk/
スクリーンショットを見るとWindowsでも扱えるようなのですが、ソースだけの配布なので少々難易度が高めです。
Wikiやメーリングリストを眺め回してみたんですが、開発者の方々はLinuxメインのようで、Windowsポートについてあまり言及している箇所が見つからなかったんですね。
5.QT用のWebKitライブラリ
QT用にもWebKitライブラリがあるようです。
- QtWebKit – WebKit
http://trac.webkit.org/wiki/QtWebKit - Riverbank | Software | PyQt | PyQt4 Download
http://www.riverbankcomputing.co.uk/software/pyqt/download
が、まだ試していません。
QWebView クラスの説明では、WebKit云々と書いてあるので、多分使えると思います。
wxWebKitをインストールする
長い話でしたが、wxWebKitを使って、Pythonで簡易ブラウザを作ってみましょう。
今回は、Python 2.6を入れた後、以下のWindowsインストーラを入れました。
- wxPython2.8-win32-unicode-2.8.10.1-py26.exe
- wxWebKit-win32-wx2.8-Py2.6-preview1.exe
これを入れた後、Pythonを立ち上げて 以下を手打ちしてみて下さい。
$ python Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import wx >>> import wx.webview >>> app = wx.PySimpleApp() >>> frame = wx.Frame(None) >>> w = wx.webview.WebView(frame) >>> w.LoadURL("http://www.google.com") >>> frame.Show() True >>> app.MainLoop()
以下のウィンドウが表示されたらOKです。(ウィンドウが前面に出ないので、タスクバーをよく見てください)
1 posted by (C)wacky
結構簡単ですよね?
wxWebKitを使って、簡易ブラウザ
では、次に簡易ブラウザを作って見ましょう。
以下にコード例を示します。
# -*- coding: utf_8 -*- import sys import pdb import wx import wx.webview class MyWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, u"WebViewを使ったWebブラウザ", size=(640,400) ) box = wx.BoxSizer(wx.VERTICAL) sz1 = wx.BoxSizer(wx.HORIZONTAL) if True: self.urlLabel = wx.StaticText(self, -1, "URL:") self.urlText = wx.TextCtrl(self, -1, "http://www.google.com", size=(300, 20) ) self.goButton = wx.Button(self, label="GO!") self.Bind( wx.EVT_BUTTON, self.OnSubmit, self.goButton ) sz1.Add(self.urlLabel, 0, wx.LEFT, 20) sz1.Add(self.urlText, 0, wx.LEFT, 20) sz1.Add(self.goButton, 0, wx.LEFT, 20) self.web = wx.webview.WebView(self, size=(300, 400)) self.web.Bind(wx.webview.EVT_WEBVIEW_LOAD, self.OnLoad) box.Add(sz1, 0, wx.EXPAND) box.Add(self.web, 1, wx.EXPAND) self.SetSizer(box) self.SetAutoLayout(True) box.Fit(self) def OnSubmit(self, event): print "set URL:", self.urlText.GetValue() self.web.LoadURL(self.urlText.GetValue()) def OnLoad(self, event): print "load state:", event.GetState() if event.GetState() == wx.webview.WEBVIEW_LOAD_DL_COMPLETED: o = self.web.GetMainFrame() html_code = o.GetPageSource() # HTML code print type(html_code) print html_code.encode("cp932", "ignore") if __name__=='__main__': app=wx.PySimpleApp() frame=MyWindow(parent=None,id=-1) frame.Show() app.MainLoop()
上記コードを実行すると、以下のようになります。
2 posted by (C)wacky
たった、これだけのコードで、簡単なブラウザが作れました。