Как я могу заставить 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()

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

: cannot connect to X server 

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

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

 Doug T.04 нояб. 2012 г., 02:27
Можете ли вы избежать включения QtGui?

Ответы на вопрос(4)

phantomjs это решение на основе webkit работает без головы, а также. попробуй это.

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

Решение Вопроса

Один из конструкторовQApplication принимает логический аргумент.GUIenabled

Если вы используете это, вы можете создать QAppliaction без X-сервера, но вы можетесоздать QWidgets.

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

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

sudo apt-get install xvfb
xvfb-run python render.py
 GreySage21 янв. 2017 г., 00:26
@mata Где вы читали, что конструктор для QApplication принимает аргумент GUIenabled? Я могу'не могу найти ничего об этом.
 Brigand04 нояб. 2012 г., 06:15
xvfb прекрасно работает! Я волновалсяЯ должен установить все X11 и запустить сервер. Спасибо! Я обновил ваш ответ тем, что у меня сработало.
 mata04 нояб. 2012 г., 02:55
Извини я нея не могу это проверить, и я как-то вспомнил, что ты просто можешьПоказывать виджеты в режиме без головы, но создавать их экземпляры. Так что если вам нужно использовать Qt, вы 'мне придется пойти с Xvfb.
 GreySage23 янв. 2017 г., 17:39
За исключением того, что webkit опирается на приложение графического интерфейса, даже если вы неt использовать любые виджеты, на которые он будет жаловаться, если вы попытаетесь использовать QCoreApplication.
 mata24 янв. 2017 г., 01:30
@GreySage Параметр GUIEnabled не 'Это не поможет в такой ситуации, поэтому вам нужно либо использовать виртуальный X-сервер, либо для PyQt5 вы можете попробовать-platform minmal подход, как предложено ниже.
 mata22 янв. 2017 г., 11:44
@GreySage - яМы обновили ссылку. Обратите внимание, что это справедливо только для PyQt4, на PyQt5 этот аргумент больше не поддерживается, возможно, потому что он не 'Во-первых, это имеет большой смысл. Вместо этого лучше использовать QCoreApplication.
 brainstorm31 мая 2018 г., 11:06
К сожалению, это не работает слишком хорошо, когда приложение умеренно сложное ?:bitbucket.org/brainstorm/flatcam/addon/pipelines/home#!/results/...
 Brigand04 нояб. 2012 г., 02:39
Это дало мнеQWidget: невозможно создать QWidget, когда графический интерфейс не используется ", У вас есть идея, как это исправить? Я'Я проверю Xvfb, на всякий случай.

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

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

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

import urllib
urllib.urlopen('http://example.com').read()
 Brigand04 нояб. 2012 г., 06:10
Да. HTML, CSS, JavaScript, изображения и т. Д.Точно так же, как посещение сайта в Chrome или Safari (они оба используют WebKit).
 GreySage20 янв. 2017 г., 22:58
Основным ограничителем для BeautifulSoup является тот факт, что он игнорирует JavaScript, поэтому OP привел к созданию webkit, как и я.я уверен.
 pydsigner06 нояб. 2012 г., 19:16
Хорошо, тогда @mata 'версия, что вы хотите.
 Brigand04 нояб. 2012 г., 03:28
Хороший общий ответ, но мне нравится иметь JavaScript. Благодарю.
 Brigand06 нояб. 2012 г., 07:49
Python WebKit позволяет вам выполнять запросы на странице (CSS2-подобные селекторы), выполнять JavaScript и т. Д. Вы можете делать то, что я хочу, с HTML и BeuatifulSoup, но мне нравится полнота.
 pydsigner06 нояб. 2012 г., 01:21
Кажется, я неправильно понял, что вы пытались сделать. Вы действительно хотите отобразить веб-страницу? Ваш пример заставил меня поверить, что вы хотели только HTML.
 pydsigner04 нояб. 2012 г., 03:44
Таким образом, код, который вы разместили, получает все ресурсы?

Ваш ответ на вопрос