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_())
我使用方法** QWebView.setViewportSize **,但是,似乎没有效果。在CenOS服务器中,我仍然像以前一样获得了相同的网页信息,尽管我将它设置为非常大的值。然后我尝试在我的笔记本电脑上运行Xorg环境中的脚本,并添加'self.web_view.show()'语句来查看效果。但是,得到相同的窗口大小没有改变...... – flyer
您是否已将setViewportSize行添加到由loadFinished信号触发的方法?当你说它没有显示整个页面时,你的意思是,对于显示的实际窗口有滚动框,但你想它显示在一个正确的? – andrean
是的。我更新了代码,在触发的方法中添加了'setViewportSize()',并且无法获取网页的全部信息。我的问题如你所说。我想获取网页的所有信息,并且如果在浏览器中浏览网页,它实际上具有滚动框。上面的代码可以获得网页的一部分。 – flyer