初めに
Herokuでスクレイピングしてハマったことをまとめてみました。
記事ではGoとagoutiを使用していますが、Pythonとかにも当てはまると思います。
invalid session id エラーが多発
下記エラーが発生
failed to retrieve page HTML: request unsuccessful: invalid session id
failed to retrieve page title: request unsuccessful: invalid session id
対策
Chromeのオプションに--disable-gpu
と--disable-dev-shm-usage
を指定したら解消しました。
options := agouti.ChromeOptions(
"args", []string{
"--headless",
"--disable-gpu",
"--disable-dev-shm-usage",
})
driver := agouti.ChromeDriver(options)
--disable-gpu
今のところですが、必要です。--disable-gpu フラグはいくつかのバグを回避するための暫定的な手段です。将来の Chrome のバージョンでは必要なくなるでしょう。詳しくは https://crbug.com/546953#c152 と https://crbug.com/695212 をご覧ください。
必須らしいです。
--disable-dev-shm-usage
メモリが少ない場合、メモリ不足でクラッシュする場合があります。
このオプションを指定することにより回避することができます。
ちなみにHerokuのプランFree dynoはメモリが512MBです。
空のHTMLが返ってくる
<html><head></head><body></body></html>
スクレイピング先のサイト側で弾かれている可能性が大
海外IPアドレスをブロック対象にしているサイトが多々あります。
ちなみにHerokuのFreeプランでは海外リージョンしか選べず、海外IPアドレスになります。
代わりに国内VPS等を使用するか、HerokuのPrivate SpaceでTokyoリージョンを選べるので回避できるかもしれません。
参考文献
https://qiita.com/yoshi10321/items/8b7e6ed2c2c15c3344c6
https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja