用QT的QWebPage模拟浏览器
很久之前就有了浏览器模拟的想法,也找到了几种方案: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()