Cream-Kuchen

Herokuでselenium×headless chromeのwebスクレイピング準備

はじめに

Herokuでwebスクレイピングをするため、ブラウザを立ち上げるにはどうするのでしょう?

seleniumchromeを用いた方法を紹介します。

目次


1, パッケージのインポート

用いるパッケージは以下です。

import os
from selenium import webdriver

※ 執筆時のseleniumのversionは、3.141.0 (安定版)

2, chrome driverの配置場所を設定

Herokuで、chrome driverのbuild packを入れると、下記に配置されます。

CHROME_DRIVER_PATH = '/app/.chromedriver/bin/chromedriver'



chromechrome driverのbuild packは、下記を参照して入れてください。

        HerokuにChromeとChrome driverを入れておく | ikapblog

          (ikapper様に御礼申し上げます。)

3, ダウンロードフォルダ―の場所を設定・作成

Herokuでchromeを起動しファイルをダウンロードすると、下記の一時フォルダーに格納されます。

DOWNLOAD_DIR = '/app/tmp'
os.mkdir(DOWNLOAD_DIR)


4, chromeの起動オプションを設定

主に、headlessモードでchromeを起動するには、下記設定が必要です。

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--window-size=1920,1080')
options.add_argument('start-maximized')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')


5, chromeの追加設定

起動オプションの他に、driverの場所やファイル等のダウンロード先の指定も必要です。

prefs = {'download.default_directory': DOWNLOAD_DIR,
         'download.prompt_for_download': False}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH,
                           options=options)
browser.command_executor._commands['send_command'] = ('POST',
                                                      '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior',
          'params': {'behavior': 'allow',
                     'downloadPath': DOWNLOAD_DIR}}
browser.execute('send_command', params)


6, 対象ページにアクセス

これまでの設定により、下記コードでアクセスできます。(ex: GoogleのHP)

URL = 'https://google.com/'
browser.get(URL)


7, コードまとめ

以上、紹介した全てのコードをまとめます。

# パッケージのインポート
import os
from selenium import webdriver

# chrome driverの配置場所を設定
CHROME_DRIVER_PATH = '/app/.chromedriver/bin/chromedriver'

# ダウンロードフォルダ―の場所を設定・作成
DOWNLOAD_DIR = '/app/tmp'
os.mkdir(DOWNLOAD_DIR)

# chromeの起動オプションを設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--window-size=1920,1080')
options.add_argument('start-maximized')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

# chromeの追加設定(driverの場所やファイル等のダウンロード先)
prefs = {'download.default_directory': DOWNLOAD_DIR,
         'download.prompt_for_download': False}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH,
                           options=options)
browser.command_executor._commands['send_command'] = ('POST',
                                                      '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior',
          'params': {'behavior': 'allow',
                     'downloadPath': DOWNLOAD_DIR}}
browser.execute('send_command', params)

# 対象ページにアクセス
URL = 'https://google.com/'
browser.get(URL)


8, 注意:例外処理の導入

chromeのheadlessモードを用いる時の注意です。

ブラウザ立ち上げ後にエラーが起こると、chromeがバックグラウンドプロセスに残ってしまいます。
これを回避するために、「try ~ except ~ finally」 の例外処理を下記のように入れておくと良いです。

これにより、エラーが起こってもブラウザが閉じられますね。

try:
    browser.get(URL)
except:
    # 例外処理
finally:
    browser.close()


おわりに

Herokuでwebスクレイピングをするため、ブラウザを立ち上げる方法を紹介しました。

開発時にTry & Errorを繰り返し苦労しないよう、参考にして頂ければ幸いです。