前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。