質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

6186閲覧

ptyhon内に記述したseleniumのwebdriver.Firefox()が、apacheで実行すると"connection refused"のエラーになってしまう

k-zil

総合スコア16

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

1グッド

0クリップ

投稿2019/04/11 12:39

編集2019/04/14 12:43

前提・実現したいこと

python(Django)でウェブスクレイピングのシステムを構築中です。
スクレイピングの対象サイトが主にjavascriptで構築されているため、seleniumを使ってデータを取得することにしました。
一通りコードを書き終わり、SSHからコマンドで実行すると上手く動作したのですが、ブラウザからコードを実行させると"connection refused"のエラーとなり実行できません。
なお、"connection refused"はDjangoが吐き出したエラーです。
Djangoのデバッグ画面のTracebackを見ると、webdriver.Firefox()の起動のところでこのエラーになっていました(下記)。
ブラウザからDjangoを実行するのは mod_wsgi+apacheを使っています。

ブラウザ上で動作するウェブサービスの一部としてこのスクレイピングが必要なので、SSHのコマンドで上手くいっても意味はなく、ブラウザからのリクエストをトリガーとして動作させたいので、このエラーを解決したいです。

発生している問題・エラーメッセージ

Message: connection refused Request Method: POST Request URL: https://example.com/django/my_project/my_app/target-path/ Django Version: 2.1 Exception Type: WebDriverException Exception Value: Message: connection refused Exception Location: /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py in check_response, line 242 Python Executable: /home/hogehoge/pyenv/bin/python Python Version: 3.6.5 Python Path: ['/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/home/hogehoge/pyenv/lib64/python3.6/site-packages', '/home/hogehoge/pyenv/lib/python3.6/site-packages', '/home/hogehoge/pyenv/my_project', '/home/hogehoge/pyenv/my_project/my_project'] Traceback /home/hogehoge/pyenv/my_project/my_app/scraper.py in get_content driver = webdriver.Firefox(executable_path=geckodriver_path, log_path=os.path.devnull, options=options) /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py in __init__ keep_alive=True) /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in __init__ self.start_session(capabilities, browser_profile) /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in start_session response = self.execute(Command.NEW_SESSION, parameters) /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in execute self.error_handler.check_response(response) /home/hogehoge/pyenv/lib64/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py in check_response raise exception_class(message, screen, stacktrace)

該当のソースコード

python

1 2 geckodriver_path = "/usr/local/bin/geckodriver" 3 options = Options() 4 options.set_headless(Options.headless) 5 6 #実行ユーザー確認 7 import getpass 8 import pwd 9 10 userid = os.getuid() 11 getuser = getpass.getuser() 12 environUser = os.environ.get("USER") 13 getpwuid = pwd.getpwuid(os.getuid())[0] 14 15 driver = webdriver.Firefox(executable_path=geckodriver_path, log_path=os.path.devnull, options=options) 16

試したこと

SSHのコマンドから実行して正常に動作するときは、上記のユーザーに関する変数は、
userid = 1000
getuser = 'hogehoge'
environUser = 'hogehoge'
getpwuid = 'hogehoge'
という具合にユーザー情報が入ります。

一方、上記のエラーとなるブラウザから実行した場合は、これらの変数は、
userid = 48
getuser = 'apache'
environUser = None
getpwuid = 'apache'
となります。

この実行ユーザーの差が原因ではないかと思っているのですが、原因の箇所が、seleniumにあるのか、webdriverにあるのか、WSGIにあるのか、apacheにあるのか、googleで検索してもそれ以上のヒントが見つけられず、ここで質問させていただいた次第です。

解決の方向性や切り分け方法などヒントをいただけると大変ありがたいです。
よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

サーバ環境:さくらVPS(centOS 7.5)
Python:3.6.5
Django :2.1
mod-wsgi 4.6.4
selenium 3.14.0

gh640👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

回答でアドバイスをいただいたお蔭でログをちゃんと見て自分なりに解決できましたので、以下に記録しておきます。


以前、webdriverのログ出力をしようとするとPermission deniedのエラーで止まってしまった経緯があるので、以下のようにしてログを出力しないようにしていました。

python

1driver = webdriver.Firefox(executable_path=geckodriver_path, log_path=os.path.devnull, options=options) # ログを/dev/nullに捨てる

しかしながら、それでは今回の問題の解析ができないので、以下のようにして再びログ出力を試みました(回答でその気づきをもらえました)。

python

1driver = webdriver.Firefox(executable_path=geckodriver_path, log_path='geckodriver.log', options=options)

ただし、この状態でスクリプトをブラウザから実行すると、以前と同じようにDjangoが以下のエラーを出して止まります。

[Errno 13] Permission denied: 'geckodriver.log'

なお、geckodriver.logの場所は以下のとおりです。

/home/hogehoge/pyenv/my_project/geckodriver.log

いろいろとパーミションを変更してみましたが状況は変わりませんでした。
実行ユーザー(apache)と実行ディレクトリに関連する問題かと思い、geckodriver.logのパスを以下のように絶対パスに変更してみました。

python

1driver = webdriver.Firefox(executable_path=geckodriver_path, log_path='/home/hogehoge/pyenv/my_project/geckodriver.log', options=options)

そうすると、Djangoのエラーメッセージが以下に変わりました。
(これでようやくログ出力が上手くいかない問題が解決して、やっと本質問の当初の問題に話が移ります)。

Message: connection refused

そこで、満を持してログ/home/hogehoge/pyenv/my_project/geckodriver.logを見てみました。

geckodriver.log

11555218695534 geckodriver INFO geckodriver 0.21.0 21555218695556 geckodriver INFO Listening on 127.0.0.1:40025 31555218697353 mozrunner::runner INFO Running command: "/usr/bin/firefox" "-marionette" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofile.WuBtj0SmJH85" 4Home directory not accessible: Permission denied 5(firefox:7328): dconf-CRITICAL **: unable to create directory '/usr/share/httpd/.cache/dconf': Permission denied. dconf will not work properly.

/usr/share/httpd/.cache/dconfが作れないと言っている模様なので、/usr/share/httpdのパーミッションを755から777に変更してみました。

そうすると問題なく動作するようになりました!!

なお、/usr/share/httpd/の中には、他に.config/.dbus/.mozilla/というディレクトリが出来ていました。

ちなみに、その後、/usr/share/httpdのパーミッションを777から755に戻しても正常に動作しました。

今回の本質的な問題は、/usr/share/httpdのパーミッションが755だったために、.cache/.config/.dbus/.mozilla/が作成できなかったこと、ということになりますが、これらがどうい役割のものなのかは不明です。

投稿2019/04/14 10:06

k-zil

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

解決の方向性や切り分け方法などヒントをいただけると大変ありがたいです。

私は同様の問題の経験がない & 私の環境では問題を再現できなさそうなので、解決のためにできそうなことのご提案だけ、してみたいと思います。

1:

次のコードからはログを捨てられてるように見えるのですが、ログをどこかに出力してエラーの詳細を確認されるとよいのではないでしょうか。

python

1driver = webdriver.Firefox(executable_path=geckodriver_path, log_path=os.path.devnull, options=options)

2:

SSH で Apache ユーザになって対象のスクリプトを実行できるのであれば、それで実行してみてどのようになるかを見るとよいのではないでしょうか。それで実行ユーザの問題かまた別の問題なのかを切り分けることができると思います。

また、 Selenium のバージョン・ CentOS のバージョン等も記載された方が、より具体的な回答がもらえる確率は上がるかもしれません。そして、「 WSGI+apacheを使っています。」とのことですが、実際には mod_wsgi を使われれていますか?それともまた別のものを使われていますか。そのあたりも詳細を記載された方がサポートがもらえやすのではないかと思います。

投稿2019/04/12 13:03

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k-zil

2019/04/14 10:15

ご回答、アドバイスありがとうございました!! おかげさまで方向性が分かり、無事に動作させることができました。(自己回答で解決内容を記しました) 自己回答にも書きましたが、ログ出力が上手くいかないという別の問題でログ出力を止めていた(その問題から安易に逃げていた)ことに気付かされました。 質問してよかったです。本当にありがとうございました!!
k-zil

2019/04/14 12:47

追伸: 念のため、質問文にSeleniumのバージョンとCentOSのバージョンを追記しました。 また、ご指摘のとおりmod_wsgiを使用しておりますので、文中の用語をmod_wsgiにあらため、バージョンも追記しました。 改めまして、ありがとうございました。
gh640

2019/04/15 10:58

大変ご丁寧にコメントいただきありがとうございます。 無事にご解決されたとのことでよかったです。回答欄・追記内容を読ませていただきましたが、とても詳しく書かれているので、きっと同様の問題にあたった人の役に立つものと思います :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問