Web クローラ実装パターン集

今まで様々な Web サイトなど情報を集めるためにクローラを作った時のノウハウ 言語は主に JavaScript(NodeJS)

実装パターン

後ろに行くほど高度・重実装

パターン 1 RSS

サイトが提供している RSS にアクセスして情報を取得する. 実装方法としては rss-parser に URL から解析してくれるライブラリあるので,簡単に実装できる.

  • メリット :構造化されたデータを利用できる,サイト側が提供しているため過剰なリクエスト発生しにくい

  • デメリット:サイトのすべての情報がとれるわけではない,

  • 利用ライブラリ: rss-parser

パターン 2 HTTP リクエスト+ HTML 解析

HTML を取得しその HTML を解析する JSDOM を使えば URL 指定で取得から解析まで1つのライブラリで行える HTML の解析は XPATH や

  • メリット :ページにあるものすべて取得できる

  • デメリット :取得対象が動的サイトの場合使えない,文字コードによってはうまく取得できないことがある

  • 利用ライブラリ: jsdom

パターン 3 HTTP リクエスト(独自)+HTML 解析

axios などで HTML を取得して,その結果を jsdom に取り込んで解析する JSDOM のライブラリではできない文字コードの変換など取得に細かく制御できる

  • メリット :jsdom の HTML 取得で取れないもの補完できる

  • デメリット:取得対象が動的サイトの場合使えない

  • 利用ライブラリ: axios + jsdom

パターン 4 API 取得

axios など HTTP リクエストからデータ取得する 取得先の API は公開された API だけでなく,ブラウザの開発者モードで通信見て API 探す場合もある たいてい JSON のレスポンスのため,解析は HTML より容易

  • メリット : 動的ページでもほしい情報取得できる.

  • デメリット:API アクセスに制限かかっている可能性がある.過剰アクセスするとアクセス遮断される恐れある.

  • 利用ライブラリ: axios

パターン 5 ヘッドレスブラウザ

pupetter や playwright などヘッドレスブラウザを制御するライブラリ使ってブラウザ表示を再現して ページ取得する.ブラウザの操作再現できるのでログインやボタン操作もできる これらのライブラリで要素の指定が JSDOM などの XPATH と少し異なる点に注意

  • メリット:一番自由度高い.動的なページ,ログイン操作など複雑な処理必要なページも取得できる

  • デメリット:要素の取得など実装が大変,通信が終わらなかったりするケースのハンドリングが必要

  • 利用ライブラリ: puppeteer playwright