Herokuでselenium×headless chromeのwebスクレイピング準備
はじめに
Herokuでwebスクレイピングをするため、ブラウザを立ち上げるにはどうするのでしょう?
seleniumとchromeを用いた方法を紹介します。
目次
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'
※ chromeやchrome 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を繰り返し苦労しないよう、参考にして頂ければ幸いです。