Как заставить Python, QT и Webkit работать на обезглавленном сервере?


У меня есть сервер 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()

При вызове конструктора он умирает с этим сообщением (оно печатается в stdout, а не в необработанном исключении).

: cannot connect to X server 

Как я могу использовать Python (2.7), QT4 и Webkit на обезглавленном сервере? Ничего и никогда не должно быть. отображается, так что я могу настроить любые настройки или все, что нужно настроить.

Я рассматривал альтернативные варианты, но это лучше всего подходит для меня и моих проектов. Если бы мне пришлось установить X-сервер, как бы я мог сделать это с минимальными затратами?
4 5

4 ответа:

Один из конструкторов QApplication принимает логический аргумент GUIenabled.
Если вы используете это, вы можете создать экземпляр QAppliaction без X-сервера, но вы не можете создать QWidgets.

Таким образом, в этом случае единственным вариантом является использование виртуального X-сервера, такого как Xvfb для визуализации графического интерфейса.

Xvfb можно установить и запустить с помощью этих команд (при условии, что у вас установлен apt-get). Код в исходном вопросе находится в файле под названием render.py.

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

Если PyQt5 является опцией, Qt 5 имеет" минимальный " плагин платформы.

Чтобы использовать его, измените argv, переданный QApplication, чтобы включить ['-platform', 'minimal'].

Если все, что вы пытаетесь сделать, это получить веб-страницу, вы можете использовать

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

Phantomjs - это решение на основе webkit. бегает и без головы. попробовать ее.

Если вы сами заинтересованы в использовании webkit, вы также можете попробовать версию qt pyslide.