¿Cómo hago para que Python, QT y Webkit funcionen en un servidor sin cabeza?

Tengo un servidor Debian Linux que uso para una variedad de cosas. Quiero que sea capaz de realizar algunos trabajos de raspado web que necesito que se realicen con regularidad.

Este código se puede encontrar aquí .

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

Una prueba simple de esto se vería así:

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

En la llamada al constructor, muere con este mensaje (se imprimió en stdout, no una excepción no detectada).

 : cannot connect to X server 

¿Cómo puedo usar Python (2.7), QT4 y Webkit en un servidor sin cabeza? Nunca se necesita mostrar nada, por lo que puedo modificar cualquier configuración o cualquier cosa que deba ser ajustada.

He buscado alternativas, pero esta es la mejor opción para mí y para mis proyectos. Si tuviera que instalar un servidor X, ¿cómo podría hacerlo con una sobrecarga mínima?

Uno de los constructores de QApplication toma un argumento booleano GUIenabled .
Si usa eso, puede instantánea QAppliaction sin un servidor X, pero no puede crear QWidgets.

Entonces, en este caso, la única opción es usar un servidor X virtual como Xvfb para representar la GUI.

Xvfb se puede instalar y ejecutar con estos comandos (suponiendo que tenga instalado apt-get). El código en la pregunta original está en un archivo llamado render.py .

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

Si PyQt5 es una opción, Qt 5 tiene el complemento de plataforma “mínimo”.

Para usarlo, modifique el argv pasado a QApplication para incluir ['-platform', 'minimal'] .

Si todo lo que intenta hacer es obtener la página web, puede usar

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

phantomjs es una solución basada en webkit. corre sin cabeza también. Pruébalo.

Si está interesado en utilizar el webkit, también puede probar la versión pyslide de qt.

En gitlab CI / CD. Agregar ['-platform', 'minimal'] y usar xvfb no funcionó para mí. En su lugar, uso QT_QPA_PLATFORM: "offscreen" variable QT_QPA_PLATFORM: "offscreen" .

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