Node.jsに限らないことだけど、スクレイピングの手法には大きく分けて
- CurlコマンドなどのHTTPクライアントソフトでページを取得する方法
- ヘッドレスブラウザ経由でページを取得する方法
の2種類があります。
1.の方法は昔ながらの方法。
昔ながらのホームページでは
- サーバーがHTMLファイルを「はいどうぞ」とクライアントに送信する
- クライアント側のブラウザは送られてきたHTMLファイルをレンダリングして表示する
という流れでページを表示していた。
なので
- Curlコマンドでページを取得
- HTMLパーサーソフトでHTMLを解析
みたいな流れでかんたんにスクレイピングができた。
でも、昨今のWEBページは「JavaScriptで動的にページを生成しようぜ!」が主流になってきていて(VueとかReactとかAngularで作られたページのこと。そういうページをSPAと呼んだりする。)、
1.の方法だと、JavaScriptが動かないのでスクレイピングができない。
CurlコマンドなどにはJavaScriptを動作させる機能がないので。
そこで2.の方法の出番。
ヘッドレスブラウザというのは「画面をなくしたブラウザ」でCUIで動かすことができるブラウザのことなのだけど
そのヘッドレスブラウザにページを取得させることで、そのページで動くはずのJavaScriptを動かせる。(普通のブラウザで取得するより低コストに。)
なので結果的に、本来のコンテンツが取得できる。・・・みたいな流れ。
で、ここからが本題だけど
1.の方法をNode.jsで実現するには
- request(今現在は非推奨らしい)
- axios
- cheerio-httpcli(日本人が作ったライブラリらしいんですけどcheerioとhttpライブラリを組み合わせて作ったっぽいです。一番オススメ。)
などのライブラリを使えばよくて
2.の方法をNode.jsで実現するには
- puppeteer(Google Chromeのヘッドレスブラウザを使うライブラリらしい)
などのライブラリを使えばいい。
ただ、2021年現在、大抵のサイトは
- HTMLのみで動く昔ながらのサイト
- HTMLが基本だけど、JavaScriptもちょいちょい動いてるサイト(Wordpressみたいな感じ)
のどちらか(大抵は後者)で、「JavaScriptが動かないとまったくコンテンツが表示されない」というモダンなサイトはそこまで多くないので、1.の方法でスクレイピングすれば事足りる場合が多い(気がする)。
天下のAmazonでさえも、1.の方法で取得できますし。
あと、VueとかReactとかAngularも、フレームワーク(例えばReactだとNextjsとか)を使えば、SPAではなくSSRやSSGなサイトを作れる上に、むしろこれらのフレームワークでは「なるべくSSGを使っていこうぜ」な流れっぽいので、「これからの時代はスクレイピングするのにヘッドレスブラウザが必須だぜ!」とはならなさそう。
おわり
コメント