如何使Python,QT和Webkit在无头服务器上运行?

问题描述 投票:6回答:5

我有Debian Linux服务器,我用它来做各种各样的事情。我希望它能够做一些我需要定期完成的网络抓取工作。

这段代码可以是found here

import sys  
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  

class Render(QWebPage):  
  def __init__(self, url):  
    self.app = QApplication(sys.argv, False)  # Line updated based on mata's answer
    QWebPage.__init__(self)  
    self.loadFinished.connect(self._loadFinished)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit()  

对它的简单测试看起来像这样:

url = 'http://example.com'
print Render(url).frame.toHtml()

在对构造函数的调用中,它会以此消息消失(它打印到stdout,而不是未捕获的异常)。

: cannot connect to X server 

如何在无头服务器上使用Python(2.7),QT4和Webkit?什么都不需要显示,所以我可以调整任何设置或任何需要调整的东西。

我已经研究过替代方案,但这对我和我的项目来说是最合适的。如果我必须安装X服务器,我怎么能以最小的开销做到这一点?

python qt webkit headless headless-browser
5个回答
20
投票

QApplication的构造函数之一采用布尔参数GUIenabled。 如果您使用它,您可以在没有X服务器的情况下实例化QAppliaction,但是您无法创建QWidgets。

所以在这种情况下,唯一的选择是使用像Xvfb这样的虚拟X服务器来渲染GUI。

可以使用这些命令安装和运行Xvfb(假设您已安装apt-get)。原始问题中的代码位于名为render.py的文件中。

sudo apt-get install xvfb
xvfb-run python render.py

4
投票

如果PyQt5是一个选项,Qt 5有“最小”平台插件。

要使用它,请修改传递给QApplication的argv以包含['-platform', 'minimal']


2
投票

如果你要做的就是获取网页,你可以使用

import urllib
urllib.urlopen('http://example.com').read()

1
投票

phantomjs是一个基于webkit的解决方案。也是无头的。试试看。

如果你热衷于自己使用webkit,你也可以尝试使用pys的pyslide版本。


1
投票

在gitlab CI / CD上。添加['-platform', 'minimal']和使用xvfb并不适合我。相反,我使用QT_QPA_PLATFORM: "offscreen"变量。

https://stackoverflow.com/a/55442821/6000005

© www.soinside.com 2019 - 2024. All rights reserved.