我有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服务器,我怎么能以最小的开销做到这一点?
QApplication
的构造函数之一采用布尔参数GUIenabled
。
如果您使用它,您可以在没有X服务器的情况下实例化QAppliaction,但是您无法创建QWidgets。
所以在这种情况下,唯一的选择是使用像Xvfb这样的虚拟X服务器来渲染GUI。
可以使用这些命令安装和运行Xvfb(假设您已安装apt-get)。原始问题中的代码位于名为render.py
的文件中。
sudo apt-get install xvfb
xvfb-run python render.py
如果PyQt5是一个选项,Qt 5有“最小”平台插件。
要使用它,请修改传递给QApplication的argv以包含['-platform', 'minimal']
。
如果你要做的就是获取网页,你可以使用
import urllib
urllib.urlopen('http://example.com').read()
phantomjs是一个基于webkit的解决方案。也是无头的。试试看。
如果你热衷于自己使用webkit,你也可以尝试使用pys的pyslide版本。
在gitlab CI / CD上。添加['-platform', 'minimal']
和使用xvfb并不适合我。相反,我使用QT_QPA_PLATFORM: "offscreen"
变量。