@Haru57636433 (haru .)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

PythonのSeleniumによるスクレイピングで、Chromeが起動後すぐに終了してしまう

解決したいこと

Seleniumを使用してスクレイピングを使用と思っています。
下記のコードを実行すると、サンプルとしてyoutubeがChromeで起動されると思っていたのですが、
一瞬ウィンドウが開いてすぐに落ちてしまいます。

発生している問題・エラー(ログの内容)

INFO 2021-05-03 18:47:41,355 [logger#log 22] ====== WebDriver manager ======
INFO 2021-05-03 18:47:41,386 [logger#log 12] Current google-chrome version is 90.0.4430
INFO 2021-05-03 18:47:41,386 [logger#log 12] Get LATEST driver version for 90.0.4430
INFO 2021-05-03 18:47:41,517 [logger#log 12] Driver [C:\Users\ユーザー名\.wdm\drivers\chromedriver\win32\90.0.4430.24\chromedriver.exe] found in cache
ERROR 2021-05-03 18:47:44,780 [kickstarter#main 82] error

該当するソースコード

import os
from selenium.webdriver import Chrome, ChromeOptions
import time
import pandas as pd
from selenium.common.exceptions import NoSuchElementException
import csv
import numpy as np
import logging
import logging.handlers
import logging.config
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager




####################ログに関する設定####################
# ロガーを取得する
logger = logging.getLogger(__name__)
#ルートロガーの作成。ログレベル=デバッグ
#logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
# ログ出力フォーマット作成
formatter = '%(levelname)s %(asctime)s [%(module)s#%(funcName)s %(lineno)d] %(message)s'
logging.basicConfig(format=formatter, filename='log.txt')
#エンコーディングをutf-8にする為に、ファイル用ハンドラの作成。ファイル名は logging.log, ログレベル=INFO, ファイルサイズ 1MB, バックアップファイル3個まで、エンコーディングは utf-8
_fileHandler = logging.FileHandler(filename='logging.log', encoding='utf-8')
_fileHandler.setLevel(logging.DEBUG)
# ログの出力形式の設定
formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
_fileHandler.setFormatter(formatter)
#ファイル用ハンドラをルートロガーに追加
logger.addHandler(_fileHandler)


logging.info("info")
logging.error("error")
logging.debug("debug")
#######################################################


# Chromeを起動する関数
def set_driver(driver_path, headless_flg):
    # Chromeドライバーの読み込み
    options = ChromeOptions()

    # ヘッドレスモード(画面非表示モード)をの設定
    if headless_flg == True:
        options.add_argument('--headless')

    # 起動オプションの設定
    options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36')
    # options.add_argument('log-level=3')
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--ignore-ssl-errors')
    options.add_argument('--incognito')          # シークレットモードの設定を付与

    # ChromeのWebDriverオブジェクトを作成する。
    ChromeDriverManager().install()
    return Chrome(executable_path=os.getcwd() + "/" + driver_path, options=options)



# main処理


def main():

    try:

        # driverを起動
        if os.name == 'nt': #Windows
            driver = set_driver("chromedriver.exe", False)
        elif os.name == 'posix': #Mac
            driver = set_driver("chromedriver", False)
        # Webサイトを開く
        driver.get("https://www.youtube.com/")
        time.sleep(5)

    except:
        logging.info("info")
        logging.error("error")
        logging.debug("debug")
        pass


    finally:
        os.kill(driver.service.process.pid,signal.SIGTERM)

# 直接起動された場合はmain()を起動(モジュールとして呼び出された場合は起動しないようにするため)
if __name__ == "__main__":
    main()

自分で試したこと

本当は対象のURLを開く⇒スクレイピング開始
という内容ですが、もとのコードでも起動して直ぐに落ちてしまうので、
処理部分を削ったコードとなっています(URL開くだけのコード)。

chromeのドライバーを自動更新するようにしており、そこがうまく起動していないのかなと思いましたが、
ログを見る限りversionには問題ないように見えます。

URLはサンプルとしてyoutubeにしていますが、URLをどのサイトに変えても、
ブラウザが立ち上がってすぐに閉じてしまいます。

1月ほど前には動いていたものが、上記記載の通り動かない(すぐに落ちてしまう)状態なので、
versionを疑いましたが問題内容でお手上げの状態です。。。

Selenium 落ちる
等でググっているのですが有力な情報に出会えずという状況です。

お忙しい中申し訳ありませんが、お力添えいただけたら幸いでございます。
宜しくお願い致します。

0 likes

1Answer

Python使いではないので、間違っているかもしれませんが、
PythonのWebdriver Managerのinstall()メソッドは、Driverのパスを戻り値として返すように見えます。
https://github.com/SergeyPirogov/webdriver_manager/blob/master/webdriver_manager/chrome.py#L32-L37

下記の場所で、Webdriver Managerを使っているものの、実際に使われるChromeDriverは、カレントディレクトリ配下の、引数で指定したパスのものが指定されています。

def set_driver(driver_path, headless_flg):
    # ・・・
    # ChromeのWebDriverオブジェクトを作成する。
    ChromeDriverManager().install()
    return Chrome(executable_path=os.getcwd() + "/" + driver_path, options=options)

以前に動作したのは、指定された場所に有効なChromeDriverがあったからだと推測されます。

0Like

Comments

  1. @Haru57636433

    Questioner

    ご回答ありがとうございます🙇
    自分の理解不足で、ご指摘いただいた内容で理解し解決致しました🙏✨

    def set_driver(driver_path, headless_flg):
    # ・・・
    # ChromeのWebDriverオブジェクトを作成する。

    return Chrome(executable_path=ChromeDriverManager().install(), options=options)


    このように書き換え、無事解決しました!
    ありがとうございました!

Your answer might help someone💌