10

私はさまざまなことに使用するDebianLinuxサーバーを持っています。定期的に行う必要のあるWebスクレイピングジョブを実行できるようにしたいと思います。

このコードはここにあります

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を使用するにはどうすればよいですか?何も表示する必要がないので、設定や調整が必要なものをtweekできます。

私は代替案を検討しましたが、これは私と私のプロジェクトに最適です。Xサーバーをインストールする必要があった場合、最小限のオーバーヘッドでどのようにインストールできますか?

4

5 に答える 5

21

のコンストラクターの1つは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がオプションの場合、Qt5には「最小限の」プラットフォームプラグインがあります。

これを使用するには、QApplicationに渡されるargvを変更して。を含めます['-platform', 'minimal']

于 2016-02-12T06:05:52.540 に答える
4

gitlab CI/CD上。xvfbを追加['-platform', 'minimal']して使用してもうまくいきませんでした。代わりに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 に答える