< Project Name/> この記事をシェアする
B
サイト内を検索する
最近の記事 読まれている記事

【スクレイピングのやり方#1】周りに勧められてスクレイピングなるものをしてみたいけど何すればいいのかわからなかったあの日の自分へ

2015.1.26(月)
image1 追記:頂いたコメントを反映させました。#3の最後にまとめております。

こんにちは。「仕事しろ」と知らない人にコメントもらって地味に傷ついた今日このごろです。

さて、今日はタイトル通りにスクレイピングなるもののhow to startをまとめてみます。

想定読者はRubyの環境を既に構築しており、Rubyの基本的な読み書き実行が出来る方です。
ドットインストールのruby編を通し見してあるレベルであればOKです。

とはいえ、そうでない方にも「ふんふん、多分こういうことね」と思っていただけるようには説明をしていきます。お昼休みの暇な時間にでも流し読みして下さい。

なにせこれも3部作。頑張っちゃった。

「スクレイピングおすすめだよ」

さて、プログラミング初心者の私として世間に物申したいことの一つに、
周りが言ってるほどスクレイピング簡単じゃない
ということがございます。
ていうかわかりにくいよ。めっちゃ下調べに時間かかったよ。

今回anemoneという、スクレイピングを(その道の方からしたら)簡単に実行できるツールを使う方法をまとめるのですが、これ初心者には追加で必要な知識が多数出てきます。
ざっくりまとめると、

  • HTMLのツリー構造の理解
  • (Nokogiriに基づく)xpathの指定方法
  • (当たり前ですが)anemoneの動かし方

上記3点の知識をインプットするとお考え下さい。

今回のサンプルでどんな感じのことができるのかを掴んでいただいたら、自身で試行錯誤してみてください。(知り合いの方はask anytimeでございます。)

今回やってみること

ご多分に漏れず、東京の不動産価格一覧でもぶっこ抜いてきましょう。なおスクレイピングでどんなことができるのかなどは先人達が語り尽くしているのでここでは触れません。

  1. homesの東京家賃相場から各地域ごとの平均賃料を部屋種別毎に引っ張ってくる
    • イメージとしては以下の表が完成される感じ
      • 千代田区:ワンルーム => 〇〇円
      • 千代田区:1K => 〇〇円
      • 西東京市:4LDK => ◯◯円
  2. 上記の表を[1]メモ帳に出力[2]csvで出力、の2パターンでアウトプットする。

といったところまで見ていきます。

今回のサンプルを自由自在に使えるようになれば大抵のものは引っ張ってこれます。がんばれ。

0.サクッと結果が欲しい方

「3部作も読んでられるか!」という至極まっとうな方は、以下のlink先にあるコードをrubyで実行してみてください。
requireしているgemを予めgem installしてから実行するのを忘れずに!

完成コードはこちら => homes.rb

1.座学:スクレイピングとはなんぞや

まずは言葉の確認をしましょう。何事も共通言語の用意が第一歩です。

重要なワードとして、

  • HTML
  • スクレイピング
  • クローリング

を抑えておきましょう。

HTML(のおさらい)

htmlの知識はドットインストールでインプットすることをオススメします。
こちらではそのおさらいで。

さて、webページというものはHTMLというもので書かれているのでした。
たとえば、このページには、タイトルらしき「これはタイトル」という文言と、どうやら本文らしき「これは本文。ほげほげ。」という文章がありますが、このページの実態は、以下のような単なるテキストデータからできています。

html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>サンプル</title>
</head>
<body>
    <h1>これはタイトル</h1>
    <p>これは本文。ほげほげ。</p>
</body>
</html>

この書き方をHTMLというのですが、ポイントはこの構造がツリー構造になっていることです。
今回スクレイピングを進める上で非常に重要な点なので念入りに思い出しましょう。以下のイメージ。

text

html – head – meta
            – title – (text)サンプル
     – body – h1    – (text)これはタイトル
            – p     – (text)これは本文。ほげほげ。

非常に読みにくい。インデントそろわねーぞ…

「あるサイトの特定のh1の中身を取得したい!」と思った時にこのツリー構造を用いて取得したい対象を絞り込んでいきます。
絞り込み方は後述します。

スクレイピング

スクレイピングとは、HTMLを解析(ツリー構造を調べること)して、欲しい要素を取得することを指します。
さきほどでいう、h1の中身を取得するといったことですね。

例えば、amazonの書籍ランキングのタイトルと最安値だけを全部ぶっこ抜き、なんてことが出来ます。

クローリング

クローリングとは、webを巡回することを意味します。
またクローリングするプログラムをクローラーといいます。

webを巡回では全く意味がわからないのでもう少し具体的に挙げだすと…

  • 指定したURLにお邪魔し、
  • 指定したURLのページのHTMLを全部取得。
  • そのページをスクレイピング(ページの中身から欲しい要素を取得)
  • 取得した結果を保存

この辺りが主な機能です。
つまり、スクレイピングをしたい!と思う場合、大抵はクローリングも行う必要があります。

そこでanemoneの登場。こちらはクローリングからスクレイピングまでまとめてこなしてくれるすごいやつで。

さて、では座学はこれくらいにして早速作業に入りましょう。

2.準備:まずは環境準備から

今回はmac上のRubyを使って作業を進めていきます。
macお持ちの方はデフォルトでRuby入っているらしいので準備が簡単(でもない)ですが、windowsの方もご安心下さい。
積極的に先人の叡智にたよりましょう。  

macの場合

デフォルトでRubyが入っています。
が、バージョンが古いので最新のものに更新しておきます。

初心者でもできた!Ruby on Rails開発環境の構築方法(Mac編)
こちらの「3.Rubyのインストール」まですすめて頂ければOKです。

windowsの場合

RubyLife – Rubyインストールが詳しそうです。
PATHとか未だに私わかってないですが、生きて行けてますので大丈夫。言われたままに作業しましょう。

どちらの場合も、

  $ ruby -v

で2.X.X以上のバージョン表記がされればOKです。

3.準備:必要なgemのインストール

gemとはrubyを便利にしてくれる後付機能だと思って下さい。
これをライブラリと世では言うようです。Excelでいうアドオンです。(使ったことはない)

さて、今回必要なgemは以下の通り。gem install (以下のgem名)を2回実行しましょう。

  1. nokogiri
  2. anemone

以上。

とはいえ、gemのインストールだけでも最初は大分ハマって大変かと思います。
誰もが通る道なので、ggr力を高めるいい機会だと思い「nokogiri インストール 出来ない」だとか、表示されるエラー名で検索するだとかしてみましょう。
学習効率はggr力によって大きく左右されます。

4.実践:まずはとりあえずサンプルで動く楽しみを知る。

とりあえずまずはサンプルを動かして気持よくなりましょう。
ゼロからでも3時間もすればこれを自分が自由自在に動かせるのかムフフと想像しながら実行してください。

Ruby

# 必要なgemを読み込み。読み込み方やその意味はrubyの基本をおさらいして下さい。
require 'nokogiri'
require 'anemone'

# 後述。
opts = {
    depth_limit: 0
}

# AnemoneにクロールさせたいURLと設定を指定した上でクローラーを起動!
Anemone.crawl("http://www.nicovideo.jp/ranking", opts) do |anemone|
  # 指定したページのあらゆる情報(urlやhtmlなど)をゲットします。
  anemone.on_every_page do |page|
    i = 1 # 後で使います。

    # page.docでnokogiriインスタンスを取得し、xpathで欲しい要素(ノード)を絞り込む
    page.doc.xpath("/html/body//section[@class='content']/div[contains(@class,'contentBody')]//li[contains(@class,'videoRanking')]/div[@class='itemContent']").each do |node|

      # 更に絞り込んでstring型に変換
      title = node.xpath("./p/a/text()").to_s
      # 更に絞り込んでstring型に変換      
      viewCount = node.xpath("./div[@class='itemData']//li[contains(@class,'view')]/span/text()").to_s 

      # 表示形式に整形
      puts i.to_s + "位:再生数:" + viewCount + " | " + title
      puts "\n———————————————–\n"
      i += 1 # iは順位を示しています。あるランキングを上から順番に取り出しています。
    end # node終わり
  end # page終わり
end # Anemone終わり

これをメモ帳にコピペしてsample.rbという名前で保存し、

  $ ruby sample.rb

で実行しましょう。

恐らくコンソール画面にダダっとリストが出てきたかと思います。
何のリストかは察して頂ければと思いますが、こんな感じでwebサイトの特定の情報だけを抽出することが出来ました。ワクワクしてきませんか?

この時点でなんとなく察して欲しいのは、

  • Anemone.crawlでwebページを巡回して、
  • xpathというメソッドの中身で取得したい要素を絞り込んでいる

ということです。細かいことはまだまだわからなくてOK。

次に続く!!

案の定収まらない。。

今回も恐怖の3部作なのでお時間ある際にふらっとご一読頂ければと思います。

次回 => 【スクレイピングのやり方#2】周りに勧められてスクレイピングなるものをしてみたいけど何すればいいのかわからなかったあの日の自分へ

今回も最後までお読みいただき、ありがとうございました。 なにか間違えなどございましたらぜひコメント頂ければ幸いです。

はてぶしてもらえるとうれしいです。よろしくです(´・ω・`)