私はウェブスクレイピングが初めてです。以下に示すように、Debian BusterとFirefox GeckodriverでPythonを使用してプライベートアプリケーションを構築しています。サーバーはオンラインです。
firefox_binary = FirefoxBinary('/usr/bin/firefox')
opts = FirefoxOptions()
opts.add_argument("--headless")
driver = webdriver.Firefox(options=opts, firefox_binary=firefox_binary)
driver.get(url)
私の目標は、Webページでajax呼び出しを介してこのアプリケーションを起動することです。これはnginxサーバーなので、pyスクリプトはphp execコマンドから呼び出されます。
exec ('/usr/bin/python3 webdriver.py');
rootまたは他のユーザーとしてログインすると、Debianのコマンドラインで正しく機能します。 Webインターフェースを使用してスクリプトを呼び出すと、ユーザーはwww-dataで、次のエラーが発生します。接続が拒否されました(OSエラー111)。
3日間、すべてのインターネットリソースを検索し、可能なすべてを試しましたが、まだ解決策はありません。
この問題の解決策を知っていますか?
編集する:
セレンバージョン3.141.0
Mozilla Firefox 78.8.0esr
ゲッコドライバー0.29
www-dataユーザーのgeckodriver.log(エラーを含む):
- 1614703595351 geckodriverについて127.0.0.1:53899で聞く
- 1614703595556 mozrunner::runner INFO コマンドの実行: "/usr/bin/firefox" "--marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile22XajP"
- ***ヘッドレスモードで動作しています。
管理者のgeckodriver.log(エラーなし):
- 1614702846828 geckodriverについて 127.0.0.1:46897で聞く
- 1614702847019 mozrunner::runner INFO コマンドの実行: "/usr/bin/firefox" "--marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile7jTA4y"
- ***ヘッドレスモードで動作しています。
- 1614702859057マリオネットINFOリスニングポート45145
- 1614702859109 Marionette WARN TLS証明書エラーは、このセッションでは無視されます。
- JavaScript警告:https://.............js?v=1.2.7199.0、行119:returnステートメント以降のコードにアクセスできません。
- JavaScript警告:https://.............js?v=1.2.7199.0、行119:returnステートメント以降のコードにアクセスできません。
- 1614702872140マリオネット警告TimedPromiseが500ミリ秒後にタイムアウトしました:スタックトレース:
- TimedPromise/<@chrome://marionette/content/sync.js:245:13
- TimedPromise@chrome://marionette/content/sync.js:230:10
- Interaction.flushEventLoop@chrome://marionette/content/interaction.js:416:10 webdriverClickElement@chrome://marionette/content/interaction.js:182:31
- 1614702900530 Marionette INFO がポート 45145 でリッスンを停止しました。
geckodriver.log geckodriver 0.21のwww-データ:
1614706982655 geckodriver 情報 geckodriver 0.21.0
1614706982680 geckodriverについて127.0.0.1:33947で聞く
1614706983553 mozrunner::runner INFO コマンドの実行: "/usr/bin/firefox" "-marionette" "--headless" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile.p37a7r0syAmR
***ヘッドレスモードで動作しています。
(firefox-esr:22409): dconf-CRITICAL **:17:44:03.845: '/var/www/.cache/dconf' ディレクトリを作成できません: 権限が拒否されました。 dconf が正しく動作しません。
答え1
これは権限の問題です。 www-dataのホームディレクトリは/var/wwwで、通常はrootが所有しています。
/var/www を www-data に付与したり、権限の変更を制限したりするには、/var/www/.mozilla を作成し、所有権を www-data に変更できます。その後、スクリプトを再実行してみてください。
現在起こっているように見えるのは、Firefoxがユーザー設定を保存しようとしましたが失敗したことです。エラーは報告されておらず、基本プロセスは完全に中断されていませんが、まだgeckodriverと通信できないほど制限されています。
答え2
はい、うまくいきます。本当にありがとう
私は次のディレクトリを作成しました:/var/www/.cache /var/www/.mozilla
www-dataに書き込み権限を付与します。
これがセキュリティの問題ではないかと思います。おそらく、Mozillaの作業ディレクトリを別の場所に指定する方が良いかもしれません。
答え3
主な問題は.cache
フォルダであり、.mozilla
権限が必要です。データは、スクリプトを実行しているユーザーのプロファイルに生成されます。
この解決策は私にとって効果的でした。
- キャッシュを保存する必要があるユーザーを決定します。私が知っている限り、そうです。
www-データ(ユーザー交響楽団)。私はフォルダをチェックインしました
/tmp/
。/tmp/Temp-276cddf8-d7c5-4a09...
Firefoxで作成されたものと同じフォルダの所有者を表示できます。
/etc/passwd
ユーザーに bash 権限が必要なので、次のファイルのサイズを変更する必要がありwww-data:33:33:www-data:/usr/sbin:/usr/sbin/nologin
ます。www-data:x:33:33:www-data:**/var/www**:**/bin/bash**
- 私の場合、パスにフォルダを作成します
/var/www/
(パスはファイルで指定されたユーザーパスにあります/etc/passwd
)。
mkdir /var/www/.cache
mkdir /var/www/.mozilla
chown www-data:www-data .cache
chown www-data:www-data .mozilla
@sdragnevの答えは正しいですが、私の場合はまだユーザーにbash権限を付与する必要があります。