@nqounetです。
「Mooで覚えるオブジェクト指向プログラミング」シリーズを読み終えた皆さん、お待たせしました!今回から始まる新シリーズでは、実践的なWebスクレイパーを一緒に作っていきます。
「Webスクレイピング」とは、プログラムを使ってWebサイトから自動的にデータを収集する技術のことです。ニュースサイトから見出しを集めたり、ECサイトから商品情報を取得したり、天気予報を自動で取得したり…Webスクレイピングができると、日々のデータ収集作業を自動化できるようになります。
このシリーズでは、Perl v5.36以降とMoo、そしてMojoliciousのHTTPクライアントであるMojo::UserAgentを使って、拡張性の高いWebスクレイパーを構築していきます。
このシリーズが対象とする読者
このシリーズは以下の読者を想定しています。
- Perl入学式を卒業した方
- 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方
- 実務で役立つモダンなPerlを使ってみたい方
前シリーズで学んだhasやsubでクラスを定義する方法、newでオブジェクトを生成する方法、そしてextendsによる継承とオーバーライドの知識を活用していきます。
このシリーズについて
このシリーズは「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方を対象に、実践的なWebスクレイパーを作りながらオブジェクト指向設計を深く学ぶシリーズです。
シリーズ全体の目次は以下をご覧ください。
今回のゴール
今回は、ニュースサイトから見出しを取得する単純なスクレイパーを作成します。まずはMojoliciousのMojo::UserAgentを使ってHTTPリクエストを送信し、取得したHTMLからMojo::DOMを使って必要な情報を抽出する方法を学びましょう。
環境構築
まず、必要なモジュールをインストールします。
| |
MojoliciousをインストールするとMojo::UserAgentとMojo::DOMが一緒にインストールされます。
Mojo::UserAgentでHTTPリクエストを送信する
Mojo::UserAgentは、Mojoliciousに含まれる軽量で高機能なHTTPクライアントです。まずは基本的な使い方を見てみましょう。
| |
このコードをfetch_demo.plとして保存し、実行すると以下のような出力が得られます。
| |
Mojo::DOMでHTMLから要素を抽出する
次に、取得したHTMLから特定の要素を抽出する方法を学びましょう。Mojo::DOMを使うと、CSSセレクタで簡単にHTML要素を指定できます。
実際のWebサイトに依存するとサイト構造の変更などで動かなくなるリスクがあるため、今回はローカルでサンプルHTMLを使って練習します。
まず、sample_news.htmlというファイルを作成します。
| |
次に、このHTMLから見出し(h2.headline)を抽出するスクリプトを作成します。
| |
このコードをnews_scraper_v1.plとして保存し、実行します。
| |
見事にHTMLから見出しだけを抽出できました!
Mojo::DOMの便利なセレクタ
Mojo::DOMでは、jQueryライクなCSSセレクタが使えます。よく使うセレクタをいくつか紹介します。
div- タグ名で選択.class- クラス名で選択#id- ID名で選択div.class- タグ名とクラス名の組み合わせdiv p- 子孫要素を選択(divの中のp)div > p- 直接の子要素を選択a[href]- 特定の属性を持つ要素を選択
例えば、記事の要約(p.summary)も取得したい場合は以下のように書きます。
| |
findは条件に一致する全ての要素を返し、atは最初の1つだけを返します。
Webスクレイピングのマナー
実際のWebサイトをスクレイピングする際は、以下のマナーを守りましょう。
robots.txtを確認し、スクレイピングが許可されているか確認する- 短時間に大量のリクエストを送らない(サーバーに負荷をかけない)
- 取得したデータの利用規約を確認する
- 可能であればAPIが提供されていないか確認する(APIがあればそちらを使う)
Mojo::UserAgentでリクエスト間隔を空けるには、sleepを使います。
| |
今回のまとめ
今回は以下のことを学びました。
- Mojo::UserAgentでHTTPリクエストを送信する方法
- Mojo::DOMでHTMLから要素を抽出する方法
- CSSセレクタによる要素の指定
- Webスクレイピングのマナー
次回予告
今回作ったスクレイパーは、ニュースサイトから見出しを取得するだけの単純なものでした。次回は、天気予報サイトからも情報を取得したくなったとき、どうなるかを見ていきます。同じようなコードをコピペして対応することになりますが…そこには罠が待っています。
お楽しみに!
