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

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

ただいまの
回答率

90.04%

seleniumのwebdriver(chromedriver)が起動しない。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,922

Mt.Kinoko

score 14

 前提・実現したいこと

webブラウザーで対象のURLを渡して、VPS上でseleniumを起動して渡されたURLのスクリーンショットを取ろうとしているのですが
エラーが出て起動しません。起動するための助言をお願いいたします。

 環境

VPS(CentOS7)
nginx 1.12.2
uWSGI
python3.6
flask
ChromeDriver 2.36.540471

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

Traceback (most recent call last):
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./api/route_api_walls.py", line 56, in create_walls_data
    selenium_util = libs.SeleniumUtility(request_form_dict['url'])
  File "./libs/seleniumutility.py", line 35, in __init__
    self.driver = webdriver.Chrome(chrome_options=opts,executable_path=self.driver_location,service_log_path=self.service_log_path)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 86, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 155, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 244, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 318, in execute
    self.error_handler.check_response(response)
  File "/usr/local/pyenv/versions/3.6.1/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 246, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.36.540471 (9c759b81a907e70363c6312294d30b6ccccc2752),platform=Linux 3.10.0-693.17.1.el7.x86_64 x86_64)

 該当のソースコード

# -*- coding: utf-8 -*-

from __future__ import absolute_import, division, print_function
from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from datetime import datetime
from PIL import Image
import time,os

class SeleniumUtility:
    chromeservice = None
    driver = ""
    display = ""

    screen_shot_path = "/var/www/xxxxx/xxxxxx/static/img/thumbnails/"
    view_image_path = "/static/img/thumbnails/"
    browser_path = '/usr/bin/google-chrome'
    driver_location = '/usr/local/bin/chromedriver'
    service_log_path = '/var/log/selenium_service.log'

    def __init__(self, url):
        self.display = Display(visible=0, size=(1366, 768))
        self.display.start()

        os.environ["HOME"] = "/home/chrome"

        opts = Options()
        opts.binary_location = self.browser_path
        opts.add_argument('--headless')
        opts.add_argument('--disable-gpu')
        opts.add_argument('--no-sandbox')
        #opts.add_argument('user-data-dir=/var/www/xxxxx/xxxxxx/chrome_tmp')
        self.driver = webdriver.Chrome(chrome_options=opts,executable_path=self.driver_location,service_log_path=self.service_log_path)
        self.driver.get(url)
        time.sleep(2)

    def screenshot(self, screen_shot_path=None):
        file_name = datetime.now().strftime("%Y%m%d%H%M%S") + ".png"
        if screen_shot_path is None:
            screen_shot_path = self.screen_shot_path + file_name

        self.driver.save_screenshot(screen_shot_path)

        img = Image.open(screen_shot_path, 'r')
        img.thumbnail((455, 256), Image.ANTIALIAS)
        img.save(self.screen_shot_path + "th_" + file_name, 'PNG', quality=100, optimize=True)
        return self.view_image_path + "th_" + file_name

    def title(self):
        return self.driver.title

    def contents(self):
        return self.driver.page_source

    def close(self):
        self.driver.close()
        self.driver.quit()
        self.display.stop()
   location / {
        include uwsgi_params;
        uwsgi_read_timeout 3000;
        uwsgi_pass unix:/var/www/xxxxx/xxxxxx/xxxxxx.sock;
    }
[uwsgi]
uid =nginx
gid = nginx

chdir = /var/www/xxxxx/xxxxxx

app = index:app

module = %(app)

callable = app

logto = /var/log/uwsgi/%n.log

master = true
processes = 5

socket = xxxxxx.sock
chmod-socket =666
vacuum = true

die-on-term = true

 試したこと

 成功

  • Supervisorを立ち上げて、flaskのサーバーで試してみたところ問題なく実行できました。
  • pythonのクラスを直接呼び出し試してみたところ問題なく実行できました。(sudo -u nginx class_selenium_test.py)

 失敗

  • nginxがhttpsで動かしていてwebdriverのlocalserverがhttpがデフォルトになっていたのでhttpsに書き換えても実行できませんでした。
  • Xvfbをpyvirtualdisplayではなく常にバックグラウンドで動かしDISPLAY番号をexportしても実行できませんでした。
  • webdriverをRemote経由で呼び出しても実行できませんでした。ただし、クラス直接呼び出しだとをChomeで直接呼び出した時と同様に実行できました。

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

  • nginx経由だとlocalhostが見つけられてない感じがします。
  • SELinuxはdisabledにしています。
  • Supervisorはhttpですが、nginxはhttpsで動かしています。

class_selenium_test.py

import sys,os
sys.path.append(os.pardir)
import libs

selenium =libs.SeleniumUtility('https://www.google.co.jp/')
print(selenium.title())
selenium.close()

https://ja.stackoverflow.com/questions/43191/centos7nginxuwsgiflaskselenium%E3%81%A7chromedriver%E3%81%8C%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%8C%E3%82%89%E3%81%AA%E3%81%84
とマルチポストになります。
解決策に関しましては、相互に記述しますので
ご容赦ください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる