10

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

此代码可在此处找到

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

在调用构造函数时,它会因这条消息而死(它被打印到标准输出,而不是未捕获的异常)。

: cannot connect to X server 

如何在无头服务器上使用 Python (2.7)、QT4 和 Webkit?不需要显示任何内容,因此我可以调整任何设置或任何需要调整的内容。

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

4

5 回答 5

21

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

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

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

sudo apt-get install xvfb
xvfb-run python render.py
于 2012-11-04T01:23:31.747 回答
5

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

要使用它,请将传递给 QApplication 的 argv 修改为 include ['-platform', 'minimal']

于 2016-02-12T06:05:52.540 回答
4

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

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

于 2019-04-01T00:37:00.603 回答
1

如果您要做的只是获取网页,则可以使用

import urllib
urllib.urlopen('http://example.com').read()
于 2012-11-04T01:45:30.757 回答
1

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

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

于 2013-12-20T23:35:35.500 回答