開発権限の持っていないシステムを外部から会員登録したりというシステムの要件があり、SPA(SinglePageApplication)を外部から無理くり操作する必要があったので消極的選択からGCF(GoogleCloudFunction)でスクレイピングしてブラウザ操作してデータ登録する方法を考えました。
スクレイピングといえばSeleniumということで何の疑いもなく、Python+Seleniumで実装していたのですが、本番環境で解決しがたい問題に直面しました。
https環境やGoogleMapAPIで読み込まれた部分がホワイトアウトしてソースが表示されません。
恐らくGCF側の設定やSeleniumのユーザーエージェントの問題のような気もしますが、有効な情報が出ず断念しました。
そこまでたどり着くのに色々試したので使用した感想を記載しておきます。
Python+Serenium
まず、GCF環境では最新の環境でスクレイピング関係の技術がサポートされていません。 最新のSeleniumが使えず、GCF用に作成されたGoogleDriverなどを使用しなければならず、更新もされていない状態です。 レガシーですが使えるには使える状態です。
参考: gcf-packs GoogleCloudFunctionsでSeleniumを使う
nodeJS+Puppeteer
Puppeteer GCFではSereniumを公式サポートしておらず、Puppeteerをサポートしている情報を得たのでこちらも少し試しました。 サポートしているとはいえ、こちらも最新のnodeには対応していない状態です。 また、情報取得は問題なかったのですが、日本語入力に問題があったため、その時点で検証をやめました。
参考: Cloud FunctionsでPuppeteer v19を動かす
PHP+PhantomJsCloud
PhantomJsCloud SSL環境になった途端ホワイトアウトする現象を確認し、上記などの方法を色々試しましたが、GCF側の設定の問題までこぎつけた結果、「では、スクレイピング毎をAPIで外注しよう」という発想を元に選定候補になりました。
SPAでも対応しているということと、1日500回まで無料なので今回のプロジェクトは無料の範囲で賄えると判断して最終的にこちらに落ち着きました。
スクレイピング自体をAPIで呼び出すのでキャッチする側はPHPでなくても得意言語でOKです。