很久之前就有了瀏覽器模擬的想法,也找到了幾種方案:HtmlUnit,headless firefox,不過都不理想。HtmlUnix是基於java的,不熟悉,而且據說兼容性也不好;用xvfb配合firefox雖然能得到結果,兼容性也不錯,但是資源占用太大,firefox是內存殺手來的。也想過用Gecko或者Webkit等組件來自己開發,不過由於水平有限,也只好作罷。直到今天才發現Qt內嵌的Webkit可以完全滿足需求,不需要安裝X,也不是java,就純粹的Qt,Qt不像gtk一樣需要X。
google到的2篇文:
Downloading a page’s content with python and WebKit
Web Scraping with PyQt4
這個東西可以用來做支持js的蜘蛛程序。例如模擬登錄,模擬一個瀏覽器環境顯然要比分析請求要方便一些,尤其是有js加密的網站。即使需要構造請求,這也是個不錯的context。
使用jquery操作dom樹的代碼例子,其實就是從第一篇文稍微改過來的:
# coding: utf8 import sys import signal import urllib from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import QWebPage class Crawler(QWebPage): def __init__(self, url, file, js): QWebPage.__init__(self) self._url = url self._file = file self._js = js def crawl(self): signal.signal(signal.SIGINT, signal.SIG_DFL) self.connect(self, SIGNAL('loadFinished(bool)'), self._finish_loading) print('載入網頁..') self.mainFrame().load(QUrl(self._url)) def _finish_loading(self, result): print('執行腳本..') self.mainFrame().evaluateJavaScript(urllib.urlopen("http://reus.me/jquery.js").read()) self.mainFrame().evaluateJavaScript(self._js) print('寫入文件..') file = open(self._file, 'w') file.write(self.mainFrame().toHtml().toUtf8()) file.close() sys.exit(0) def main(): url = 'http://bbs.jnustu.net' file = 'fs' js = "$('body').html('YE?')" app = QApplication(sys.argv) crawler = Crawler(url, file, js) crawler.crawl() sys.exit(app.exec_()) if __name__ == '__main__': main()
