今回がGoogle Cloud Functionsを使ってみるシリーズの3本目で最後になる記事です。最後は、Cloud Functionsを使う契機になったseleniumを使ったスクレイピングを使ったスクレイピングについてです。
今までの記事は下記になります。今回もどなたかの参考になれば幸いです。
Part1. Cloud Functionsの基本的な使い方: httpリクエストをトリガーとするHTTP functionsの使い方、ローカルマシンからのデプロイ
Part2. Cloud Functionsの様々な使い方: サードパーティパッケージ、自作パッケージの利用、スプレッドシート(GAS)との連携
Part3. Seleniumを使ったスクレイピング
備考. background functionは対象外
1. Cloud Funtionsでseleniumを使ったスクレイピングを行う方法
Cloud Functionsでseleniumを使ってスクレイピングをする方法は、日本語情報だとほぼ皆無です。一方で、node.js+puppeteerでのスクレイピングは昨年末に導入されたようで、公式も含めてかなり情報がありました。またAWS lambdaでの情報も多数あります。AWS使ったことないけど、AWSから類推してやってみようかなと最初は思っていたのですが、さすがインターネット。英語情報を開拓すると、同じことを考える人、同じことを考えた人のためにツールを作ってくれる人々がいました。今回は、そんな方の使ったツールを感謝の思いを抱きなく、惜しみなく使わせていただきます。
今回のツールというかgithubリポジトリはこちらになります。pandas、numpy用のディレクトリもあるのですが、そちらは不要です。また、gcf-packsディレクトリの中にはzipファイルが入っていますが、これはsourceディレクトリをzip化したものです。GCPコンソールではzipファイルをアップロードすることができますが、このzipファイルはそういった場合に活用できます。zipファイルでのアップロードはAWS lambdaでもできるようです。
このsourceディレクトリの中でseleniumのスクレイピングのために大切なファイルは以下になります。
- headless-chromium.zip…オープソースのウェブブラウザでChromeなど多くのブラウザの元になっている
- chromedriver…chromiumでseleniumを扱うためのソフトウェア
- seleiumパッケージ
seleiumでのスクレイピングをしたことある方ならわかる必要なツールがしっかりと揃えられています。fake_useragentなど使えそうなパッケージも一緒に入っていますが、他のファイルは削除しても大丈夫だと思います。
2. Cloud Functionsでseleniumを使ったスクレイピングをしてみる
このファイルをそのまま使ってスクレイピングする方法は以下になります。headless-chromiumがzip化しているので、それを解凍する必要があります。ちなみにmain.pyはランダムにページを返すWikipediaのURL(“https://en.wikipedia.org/wiki/Special:Random”)を呼び出して、そのページのタイトルを返すプログラムが書かれています。
$ git clone https://github.com/ryfeus/gcf-packs.git
$ cd gcf-packs/selenium_chrome/source
source$ unzip headless-chromium.zip
source$ gcloud functions deploy handler --runtime python37 --trigger-http --region asia-northeast1 --memory 512MB
curlでapiを叩いてみるとかえってくる値が毎回変わるのがわかると思います。
source$ curl <関数のURL>
このディレクトリには多数のファイルやフォルダが入っていますが、headless-chromium、chromedriver、selenium、main.pyが入っていれば活用することができます。また、各ソフトのバージョンについては、このように使えるものと使えないものがあるようなので、このリポジトリに含まれているバージョンを活用すれば間違い無いと思います。
これでCloud Functionsでもseleniumを使うことができるので、JavaScriptが使われたサイトのスクレイピングにもCloud Functionsを活用することができます。どんどん使ってみて下さい。
3. 最後に
3本目はかなり短くなりましたが、Cloud FunctionsでSeleniumを使う方法は理解できたと思います。オリジナルのプログラムでも紹介しようと思ったのですが、この形がわかってしまえばあとはGASにしろ、GCPの他の機能や外部プログラムとの接続にしろ、基本はURLを叩くだけなのでまあ良いかなと思って、やめました。なにはともあれ、最近のサーバレスアーキテクチャー(そんなよく知らないけど)の流れの中でAWS lambdaはとても注目されており、GCPのCloud Functionsもそれに追随していっているように思います。これからCloud Functionsの存在感はどんどん高まっていくと思うので、私も引き続き色々なことに活用していきたいと思います。
この3本の記事がどなたかの参考になりましたら、幸いです。読んで頂き、ありがとうございました。