【Python】Webスクレイピング_Chromeの起動

2023年6月3日PG,Python

処理概要

SeleniumとChrome Driverでブラウザ(Chrome)を操作する

ChromeDriverの事前準備不要


モジュールのインストール

  • 必要なモジュールをpipでインストールする
pip install selenium
pip install chromedriver_binary
pip install chromedriver-binary-auto
pip install webdriver-manager

ブラウザ操作のテストコード

  • 動作テストコードの例
# ----------------------------------------
# モジュールのインポート
# ----------------------------------------
import time

import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager

# ----------------------------------------
# ChromeDriverの設定
# ----------------------------------------
CHROMEDRIVER = ChromeDriverManager().install()
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

# ----------------------------------------
# 処理開始
# ----------------------------------------
# ブラウザを起動する
driver = webdriver.Chrome(service=chrome_service)

# 指定するURLを開く
driver.get('https://www.google.com/')

# XPathで検索ボックスを特定する
search_box_xpath = '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input'
driver.find_element(By.XPATH, search_box_xpath).send_keys('Selenium実践入門')

# NAMEで検索ボックスを特定する
search_box_name = 'q'
driver.find_element(By.NAME, search_box_name).clear()

# 検索の3秒後にブラウザを閉じる
driver.find_element(By.XPATH, search_box_xpath).send_keys('Selenium実践入門' + Keys.RETURN)
time.sleep(3)
driver.quit()

オプションと起動時の設定の説明

ChromeDriverManager().install()

  • ブラウザのバージョンに合わせたChromeDriverをインストールする
  • 実行すると使用するChromeDriverのパスを返す
  • 下記はインストールと同時に変数 CHROMEDRIVER に実行ファイルパスを格納する設定
CHROMEDRIVER = ChromeDriverManager().install()

fs.Service(executable_path='ChromeDriverのパス')

  • 実行時にChromeDriverのパスを指定するのが推奨となっている
  • 指定しないと警告が表示されるので表示されないように設定する
  • 下記は ChromeDriverManager().install() で返ってくるパスを格納した変数を使って設定している
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

webdriver.ChromeOptions()

  • オプションを指定するためのクラス

add_argument('--headless')

  • ヘッドレスモードで起動する関数と引数
  • ブラウザを表示させずにバックグラウンドで処理する

add_argument('--user-data-dir=' + PROFILE_PATH)

  • 起動するChromeのアカウントを指定する
PROFILE_PATH = r'C:\Users\---\AppData\Local\Google\Chrome\User Data'
chrome_options.add_argument('--user-data-dir=' + PROFILE_PATH)

add_experimental_option('excludeSwitches', ['enable-automation'])

  • ブラウザ起動時のテスト実行警告を非表示にする
  • 指定しないとブラウザに以下のメッセージが表示される
Chrome は 自動テスト ソフトウェアによって制御されています。

add_experimental_option('excludeSwitches', ['enable-logging'])

  • DevToolsのログを出力しない
  • 指定しないとコンソールに以下のようなログが表示される
  • 無視しても良いので非表示にする
DevTools listening on ws://127.0.0.1:52518/devtools/browser/85b4357a-7fc7-4969-a3f0-e6c235eecc03
>>> [8244:10016:1215/205133.795:ERROR:device_event_log_impl.cc(215)] [20:30:40.795] USB: usb_device_handle_win.cc:1045 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F)

add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])

  • 上記のテスト実行警告とDevToolsのログを非表示にする指定の仕方

add_experimental_option('prefs', {'download.default_directory': 'ディレクトリパス'})

  • ダウンロードフォルダを指定する

webdriver.Chrome().implicitly_wait(XX)

  • 要素が見つかるまで指定秒数待つ

各種オプションを指定したブラウザ操作のサンプル

# ----------------------------------------
# モジュールのインポート
# ----------------------------------------
import time

import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager

# ----------------------------------------
# ChromeDriverの設定
# ----------------------------------------
CHROMEDRIVER = ChromeDriverManager().install()
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

# オプションを設定する
chrome_options = webdriver.ChromeOptions()
# ヘッドレスモードで起動する
chrome_options.add_argument('--headless')
# テスト実行警告とDevToolsのログを非表示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])
# ファイルのダウンロードフォルダを指定する
dl_folder = 'C:\temp'
chrome_options.add_experimental_option('prefs', {'download.default_directory': dl_folder})

# ----------------------------------------
# 処理開始
# ----------------------------------------
# ブラウザを起動する
driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
# ブラウザを最大化する
driver.maximize_window()
# 要素が見つかるまで最大10秒待つ設定
driver.implicitly_wait(10)

# 指定したURLを開く
driver.get('https://www.google.com/')

# XPathで検索ボックスを特定する
search_box_xpath = '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input'
driver.find_element(By.XPATH, search_box_xpath).send_keys('Selenium実践入門')

# NAMEで検索ボックスを特定する
search_box_name = 'q'
driver.find_element(By.NAME, search_box_name).clear()

# 検索の3秒後にブラウザを閉じる
driver.find_element(By.XPATH, search_box_xpath).send_keys('Selenium実践入門' + Keys.RETURN)
time.sleep(3)
driver.quit()

PG,Python

Posted by junichi