先日herokuでPythonからseleniumとchromedriverを起動させて定期的にブラウザ画面の情報をスクレイピングするプログラムを実装したのですが、chromedriver の環境変数設定とかbuildpackとかでいろいろとはまったので手順をメモしておこうと思います
前準備
HerokuのアカウントとHeroku-CLIは導入済みの前提で話を進めます。アカウントやCLIのインストールがまだの人は以下の記事を参考にしたりググってみてください
関連記事:Python製プログラムを「Heroku scheduler」を使って無料で定期実行する
Herokuの設定
通常のプログラムのデプロイとは別に環境変数とビルドパックの設定をWebサイトから行う必要があります。ダッシュボードからseleniumを実行したいプロジェクトの個別ページにアクセスしてsettingから以下の情報を追加します
環境変数の設定
Key | Value |
---|---|
CHROMEDRIVER_PATH | /app/.chromedriver/bin/chromedriver |
GOOGLE_CHROME_BIN | /app/.apt/usr/bin/google-chrome |
buildpack
Settings > BuildpacksセクションのAdd buildpackから以下の3つを追加します。
Buildpack | URL |
---|---|
python | heroku/python |
chromedrive | https://github.com/heroku/heroku-buildpack-chromedriver.git |
google-chrome | https://github.com/heroku/heroku-buildpack-google-chrome.git |
上記がすべて正常に完了していればアプリの個別URL(https://dashboard.heroku.com/apps/<アプリ名>/settings)のsettingのconfigVarsとBuildPacksの表示が下記のようになっています
ソースコード
<main.py>
from selenium import webdriver import os # herokuで実行できるようにheadlessにする chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--no-sandbox") chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") # driver起動 driver = webdriver.Chrome(executable_path=os.environ.get("CHROMEDRIVER_PATH"), chrome_options=chrome_options) # サイトにアクセス driver.get('https://www.google.co.jp') # HTMLを取得 print(driver.page_source) # ブラウザ終了 driver.quit()
関連記事:【Python】Seleniumでのスクレイピングでよく使うサンプルコードまとめ
処理は簡単でseleniumを起動してhttps://www.google.co.jpにアクセスしてhtmlを取得してprintするだけです。注意点はoptionでブラウザを表示させない–headlessを絶対指定しないといけない点です。herokuはGUIがないので通所の設定でSeleniumを起動させると表示するブラウザ画面がないのでエラーになります。これが普通のPCで実行するのと異なる点かなと思います
あとPYファイルのほかにPYTHONのバージョンを指定するruntime.txtとインストールするライブラリを指定するrequirements.txtも作成してmain.pyと同じディレクトリに配置します
<requirements.txt>
selenium==4.6.0
<runtime.txt>
python-3.10.8
配置イメージ
この状態でherokuにcommit pushします
cd <cloneして作成したアプリ名のディレクトリ> git add . git commit -m "first commit" git push heroku master
参考:Python製プログラムを「Heroku scheduler」を使って無料で定期実行する
プログラムの実行
デプロイしたら試しにコードをCLI経由で実行してみます。実行コマンドは以下になります。
<コード実行コマンド>
$ heroku run python main.py
<実行結果>
正常に実行されるとseleniumでアクセスしたgoogleのトップページのサイトHTMLが出力されます
定期実行する場合はスケジューラーにpython main.pyを設定してあげればよいです
参考:Python製プログラムを「Heroku scheduler」を使って無料で定期実行する
では~
コメント