用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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM