繁体   English   中英

在PyQt4的QWebView中设置页面大小

[英]Set page size in QWebView in PyQt4

我使用PyQt4编写了python脚本,以抓取包括AJAX在内的网页。 它可以工作,但是只能获得“单屏”页面,我认为这与屏幕分辨率有关。 我在没有X环境的CentOS服务器上运行脚本。 我使用Xvfb并进行以下设置:

$ 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_())

您可以使用setViewportSize方法将web_page调整为实际大小:

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

发出loadFinished之后触发滚动事件:

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

尽管我不确定正在加载的页面的实际工作方式,但是您可能需要等到滚动事件后ajax请求完成才能使数据显示在页面上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM