Nokogiriを使ってWebページから情報を取得する
RubyのNokogiri(gem)を使って特定のWebページから特定の情報を抜き出す。
今回は乃木坂46公式サイトから本日のテレビとラジオとWEBの出演情報を取得する例を書く。
具体的にはトップページの下の図の赤い枠で囲ったスケジュールのWEB, RADIO, TVと書かれた情報を抜き出して表示する(青い枠で囲った部分にも同じようにメティア出演情報が載っており、どちらでもよいが今回は赤い枠の方を抜き出す)。
準備
まずはgem install nokogiri
でNokogiriをインストール。
次に抜き出す情報のCSSのクラス名を調べる。
ブラウザのWeb開発ツールを用いるのが簡単である。
WindowsであればFirefoxやChromeでCtrl+Shift+Iで開く(Chrome: メニュー>その他ツール>デベロッパーツール / Firefox: メニュー>Web開発>インスペクター でも開ける)。
取得したいWebページに移動して、開発ツール左上の矢印っぽいボタン(下の図の赤い枠で囲われたところ)を押してから調べたい場所をクリックするとウィンドウ内(オレンジの枠で囲まれたところ)に要素が表示される。
今回は本日のテレビとラジオとWEBの出演情報を取得したいので、それぞれの要素のCSSでのクラス名を確認する。上図のように赤い枠のボタンをクリックしてからTV, RADIO, WEBの部分をクリックして表示されたクラス(オレンジの枠で囲まれたところ)を確認したところ、aタグのそれぞれtv, radio, webクラス (a.tv, a.radio, a.web)であることがわかる。(なお、その日にTV, RADIO, WEB出演がない日は表示されないので注意。)
また、このaタグはtodayというクラスのdivタグに挟まれている(div.today)のが確認できる。
こうして、得たい情報のクラス名はtv, radio, webで、それらが配置されているブロック(divタグで囲まれた部分)はtodayというクラス名がつけられていることがわかった。
実装
コードを見ながら説明するのが早いのでコードを先に載せる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require "nokogiri" require "open-uri" url=URI::parse("http://www.nogizaka46.com") page=url.read("user-agent"=>"aaaa") html=Nokogiri::HTML::parse(page) media={テレビ:".tv",ラジオ:".radio",Web:".web"} media.each do |key,value| puts("[#{key}]") tmp=html.css(".today").css(value) if tmp.size==0 then puts(" 出演はありません") else tmp.each do |item| puts(" - #{item.content}") end end puts("") end |
4行目でターゲットのURLを指定している。
5行目で4行目で指定したURLから情報を取得している。この際、ユーザーエージェント(UA)を指定している。UAの指定が不要な場合はオプションを空にしてもよいが、たまにUAを指定しないと弾かれるサイトがあるのでその場合は5行目のように指定する(UA設定に関する詳細はこちらを参照)。UAの文字列はFirefoxやChromeを真似てみても良いが、今回は何でも良いので”aaaa”という文字列にした。
なお、ユーザーエージェントの設定がされていない場合に弾かれるときにはopen-uri.rb:363:in 'open_http': 403 Forbidden (OpenURI::HTTPError)
というエラーが出た。
6行目ではNokogiriを使ってHTMLをパースしている。
9行目からは必要な情報を抜き出す処理をしている。
css
メソッドで指定したクラス(“クラス名の先頭に.をつけること”)のタグで囲まれた要素を取得できるので、html.css(".today").css(".tv")
とすれば、div class="today"
内のa class="tv"
で囲まれた部分のリストが取得できる(1件もない場合は空のリストになる)。各要素に対して文字列を取り出すにはcontent
メソッドを用いる(16行目)。
実行
上記のコードを保存して実行すると、確かに本日のスケジュールが表示された(当然出力は日によって異なる)。
[テレビ]
– 04:15〜04:45 TBS「開運音楽堂」衛藤美彩
– 9:55~10:25 フジテレビ系「ライオンのグータッチ」西野七瀬
– 25:15~25:45 フジテレビ系「馬好王国~UmazuKingdom~」松村沙友理
[ラジオ]
– 6:00~8:00 J-WAVE「POP OF THE WORLD」齋藤飛鳥
– 24:30~25:00 TOKYO FM「エバンジェリストスクール!」若月佑美
– 25:00~25:30 TOKYO FM「ジュグラーの波~なぜ衛藤美彩はラジオで数字を学ぶのか?~」衛藤美彩
[Web]
– 「ニッカンスポーツ・コム」寺田蘭世
因みに、”.today”を指定しない場合は、最初の図の青く囲まれた部分の情報も拾ってきてしまい、2重に表示されてしまうので注意。
このようにして簡単に情報が得られるので、cronで1日に1回取得させて、slackに投げたり、motdに出力してログインしたときに情報が表示されるようにしたり・・・と様々な応用ができる。
同じカテゴリー(技術メモ)の他の記事を表示
全記事を表示
タグ: Ruby, Web, プログラミング
コメント (1)