開発権限の持っていないシステムを外部から会員登録したりというシステムの要件があり、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。