以前はXサーバーなどでDjangoで作ったサービスなどの運営を行っていたのですが今は完全にAWSにシフトをし、Seleniumを使ったサービスに力を入れていました。
そして昨夜、ブラウザがクラッシュする不具合に頭を悩まされました。
事の発端
現在取り扱っている案件の1つに「スマホでスクレイピングをしたい」と要望を受けてあるECサイトをローカルでテストしていました。
そして本番環境、つまりEC2に上げていざ実装という時になんとブラウザがクラッシュしました。。。
その時の環境が以下です
・EC2(microt2)
・Nginx
・Docker
・Gunicorn
・Django3.0
・Python 3.8
AWSに詳しい方はすぐに見てわかると思うのですがこのインスタンスってスクレイピングをするにはかなりスペックが低いんです。
なので落ちて当たり前なんですけどこの時はリミットを掛けていてこのスペックでも落ちるはずのない物でした。
原因はメモリ不足
Seleniumが実行中に落ちた原因はメモリ不足でした。
直す方法は主に2つあります。
1つ目は「インスタンスをアップグレードする」ことです。
どうしても内部のコードを変えたくない方はこの方法が良いと思いますが個人的にはあまりおすすめはしたくないです。
高くなるというのももちろんありますが根本的に処理を軽くしないと取得数が増えれば同じことが起こります。
2つ目は今回やった方法なのですが「省エネモードを使うこと」です。
Headlessモードを使う時点で必ずoptionのライブラリを使う必要が出てくるので使っているとは思いますはoptionには処理を軽くする機能があります。
今回はこれだけで上手く行きましたけど中にはこれでもダメな時があるみたいてそんな時は画面サイズを小さくしたりすればだいぶ軽くなります。