2012-10-15 45 views
1

我使用PyQt4編寫了一個python腳本來抓取包括AJAX的網頁。它的工作原理,但它只能得到我認爲與屏幕分辨率有關的'單屏'頁面。我在沒有X環境的CentOS服務器上運行腳本。我用的Xvfb,並做如下設置:在PyQt4的QWebView中設置頁面大小

$ Xvfb :100 -screen 0 9000x9000x24 & 
$ export DISPLAY=:100 

,但它並沒有幫助,以獲得更多的網頁信息,。

我是PyQt4的新手。有沒有一種方法來設置QWebView大小來放大顯示窗口大小?

任何有關QtWebkit的手冊也是值得讚賞的。

以下是我的代碼:

#!/usr/bin/env python 
#coding: utf-8 


import sys 

from PyQt4.QtCore import QUrl, SIGNAL, QSize 
from PyQt4.QtGui import QApplication 
from PyQt4.QtWebKit import QWebPage, QWebView, QWebSettings 

class WebPage(QWebPage): 

    def javaScriptConsoleMessage(self, message, lineNumber, sourceID): 
     sys.stderr.write('Javascritp error at line number %d\n' % (lineNumber)) 
     sys.stderr.write('%s\n' % (message,)) 
     sys.stderr.write('Source ID: %s\n' % (sourceID,)) 


class Crawler(QApplication): 

    def __init__(self, url): 
     super(Crawler, self).__init__(sys.argv) 
     self.url = url 
     self.web_view = QWebView() 
     self.web_page = WebPage() 
     self.web_view.setPage(self.web_page) 
     self.web_frame = self.web_page.currentFrame() 

     print 'Before connecting' 
     self.connect(self.web_view, SIGNAL('loadFinished(bool)'), self.loadFinished) 
     print 'After connecting' 

     print 'Before loading' 
     self.web_frame.load(QUrl(self.url)) 
     print 'After loading' 

    def loadFinished(self, ok): 
     self.web_page.setViewportSize(self.web_page.mainFrame().contentsSize()) 
     print 'In callback, before writing' 
     with open('jd.txt', 'ab+') as fp: 
      fp.write(self.web_page.currentFrame().toHtml().toUtf8()) 
     print 'In callback, after writing' 


if __name__ == '__main__': 
    url = 'http://www.360buy.com/product/707047.html' 
    crawler = Crawler(url) 
    sys.exit(crawler.exec_()) 

回答

0

,您可以調整web_page到它的實際大小使用setViewportSize方法:loadFinished後

self.web_page.setViewportSize(self.web_page.mainFrame().contentsSize()) 

觸發滾動事件發出:

def loadFinished(self, ok): 
    js_scroll = "window.scrollBy(0, 200);" 
    self.web_page.mainFrame().documentElement().evaluateJavaScript(js_scroll) 

儘管我不確定您正在加載的頁面是如何實際工作的,但y ou可能需要等待ajax請求在滾動事件之後完成,數據纔會出現在頁面上。

+0

我使用方法** QWebView.setViewportSize **,但是,似乎沒有效果。在CenOS服務器中,我仍然像以前一樣獲得了相同的網頁信息,儘管我將它設置爲非常大的值。然後我嘗試在我的筆記本電腦上運行Xorg環境中的腳本,並添加'self.web_view.show()'語句來查看效果。但是,得到相同的窗口大小沒有改變...... – flyer

+0

您是否已將setViewportSize行添加到由loadFinished信號觸發的方法?當你說它沒有顯示整個頁面時,你的意思是,對於顯示的實際窗口有滾動框,但你想它顯示在一個正確的? – andrean

+0

是的。我更新了代碼,在觸發的方法中添加了'setViewportSize()',並且無法獲取網頁的全部信息。我的問題如你所說。我想獲取網頁的所有信息,並且如果在瀏覽器中瀏覽網頁,它實際上具有滾動框。上面的代碼可以獲得網頁的一部分。 – flyer

相關問題