用QT的QWebPage模拟浏览器

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

 

posted on 2013-01-09 18:14  misoag  阅读(6369)  评论(0编辑  收藏  举报

导航