EC2上でseleniumを使ってスクレイピングしているときに、次のような状況が発生した場合の原因と対処法についてまとめています。
- EC2でseleniumを使っているときに、データ取得までにとても時間がかかる。
- 最初はスムーズにいっていたのに、実行を繰り返すうちに処理が重くなっていく。
- ずーっと待っていると、最終的にchromeにたどり着けないエラーが表示される。
最終的に表示されるエラー内容
$ python3 ファイル名.py
selenium.common.exceptions.WebDriverException:
Message: chrome not reachable
原因
chromeで複数のプロセスやドライバーが何個も立ち上がってしまっている。(※headlessブラウザなので目視では確認できません。)
対処法
対処法は次のとおりです。
- 立ち上がっているchromeブラウザ&ドライバーを全て停止する。
- ファイル末尾に
オブジェクト.quit()
を記述。
実際の対処手順例
1.chromeドライバーが複数立ち上がっていないか確認する。
#「chrome」を含む実行中のプロセスをすべて表示
$ ps aux | grep chrome
#以下のような記述がたくさん表示された場合、複数のwebdriverが起動している。
ユーザー名 pts/0 Sl 04:09 0:00
chromedriver --port=49671
#以下のような記述がたくさん表示された場合、複数のブラウザのプロセスが起動している。
ユーザー名 pts/0 S 04:32 0:00
/opt/google/chrome/chrome --type=broker
*Chromeはブラウザを1つ表示した場合でも、複数のプロセスを実行しています。
コマンドの詳細
ps aux
- psコマンド:実行中のコマンドを表示する
- auxはオプション
- a:すべてのユーザーのプロセス
- u:ユーザー名と開始時刻を表示
- x:制御端末のないプロセスも表示
- Process Status
- |grepとセットで使うことが多い
|grep テキスト
- 「|(パイプ)」:コマンドを追加
- grep テキスト:テキストを含む処理のみ表示
- Global Regular Expression Print
2.chromeブラウザとwebdriverを終了する
killall chrome
killall webdriver
再度実行中のファイルを確認。
$ ps aux | grep chrome
#以下だけ残り、他は終了完了。
ユーザー名 pts/0 S+ 04:35 0:00
grep --color=auto chrome
3.処理にquit()を追記
.pyファイルの末尾でquit()を実行しすべてのブラウザを閉じる。
#webdriverのChromeを終了する。
browser = webdriver.Chrome(options=options)
browser.quit()
webdriver起動の変数をdriverなど他の記述にしている場合は、そちらに修正。例:driver.quit()
以上で、
・pyファイルの実行がぐっと早くなります。
・処理後の実行中プロセスもなくなります。
補足
別記事でsandboxを停止したり、オプションで–no-sandboxをつけるようなものがありましたが、私の場合、sandboxは立ち上がっておらず不要でした。
もし実行中プロセスでsandboxが表示された方は下記も試してみると効果あるかもです。
killall chrome-sandbox
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-setuid-sandbox")
元記事はこちら
なお、sandboxというのは、外のプログラムに影響のない隔離された環境のことです。(ウイルスが含まれてそうなプログラムを実行するのに使うなど)