その他
    ホーム 技術発信 DoRuby Gem MechanizeでWebスクレイピング
    Gem MechanizeでWebスクレイピング
     

    Gem MechanizeでWebスクレイピング

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Gem MechanizeでWebスクレイピング

    以前Webスクレイピングを行う際に利用した、RubyのMechanizeが良い感じだったので紹介したいと思います。

    参考
    https://www.xmisao.com/2013/10/05/ruby-www-mechanize.html

    環境

    Mac OS X El Captain 10.11.5

    ruby 2.4.1

    Mechanizeとは

    web上での操作を、rubyでも行えるようにしてくれるgemです。
    フォームの操作や、リンクの取得・遷移などを簡単におこなうことが出来ます。

    Mechanizeのインストール

    $ gem install mechanize
    # nokogiriを利用しているので、一緒にインストールされます。
    # 2017/09/XX現在、最新バージョンは2.7.5です  
    

    以下のように、Mechanizeクラスのインスタンスを作成することで、webページへのアクセス・情報取得が可能です。

    require 'rubygems'
    require 'mechanize'
    
    # Mehcanizeのインスタンス作成
    agent = Mechanize.new
    # getメソッドでページへのアクセス
    page = agent.get('https://www.google.co.jp')
    
    # 例:ページタイトルの表示
    p page.title
    # => "google"
    
    

    Mechanizeで出来ること

    mechanizeには、便利なメソッドが数多く存在します。
    自分がwebスクレイピングをする際に利用したものを、いくつか紹介したいと思います。

    フォーム操作

    自分はこれがやりたくてこのgemに辿り着きました。(調査不足だっただけで、ほかのgemでも出来るかもしれません。)

    取得したページからフォームを取得して、値を代入・ボタンのクリックをすることで遷移先のページが取得できます。

    ##Googleの検索フォームで、Dorubyを検索する
    
    #検索フォームの取得
    form = page.forms.first
    => #<Mechanize::Form
     {name "f"}
     {method "GET"}
     {action "/search"}
     {fields
      [hidden:0x3ff22e4a64f0 type: hidden name: ie value: Shift_JIS]
      [hidden:0x3ff22e4a6388 type: hidden name: hl value: ja]
      [hidden:0x3ff22e4a6220 type: hidden name: source value: hp]
      [hidden:0x3ff22e4a60b8 type: hidden name: biw value: ]
      [hidden:0x3ff22e8afd94 type: hidden name: bih value: ]
      [text:0x3ff22e8af790 type:  name: q value: ]
      [hidden:0x3ff22e8ae9e4 type: hidden name: gbv value: 1]}
     {radiobuttons}
     {checkboxes}
     {file_uploads}
     {buttons
      [submit:0x3ff22e8af3d0 type: submit name: btnG value: Google 検索]
      [submit:0x3ff22e8aefc0 type: submit name: btnI value: Im Feeling Lucky]}>
    
    # name: q に検索クエリを代入
    form['q'] = 'doruby'
    
    # 検索ボタンのクリック
    search_result = form.click_button
    
    p search_result.title 
    => "doruby - Google 検索"
    
    

    リンクを辿る

    clickメソッドを使うことで、ページに含まれるリンクを辿ることが出来ます。
    下記の例では、link_withを利用してリンクの取得を行っています。
    今回はtextで取得していますが、classやidで指定・取得することも可能です。

    # リンクの取得とクリック
    doruby_page = search_result.link_with(text: "DoRuby: Web技術・マーケティング情報発信ブログ").click
    
    p doruby_page.title
    => "Web技術・マーケティング情報発信ブログ | DoRuby"
    

    Xpathを利用したWebスクレイピング

    取得したページは、Xpathを利用してスクレイピングすることが出来ます。
    また、この際にMechanize::PageからNokogiri::XML::Nodeにパースされるので、返り値はNokogiriになっています

    # page.search('Xpath')で、XPathを利用した探索が可能
    
    # aタグのhref要素に、entriesが含まれるものを探す
    entries_first = doruby_page.search('//a[contains(@href, "entries")]').first
    p entries_first.values
    => ["/users/r357_on_rails/entries/Kali-Linux(2016-X)の日本語利用について"]
    

    上記の3つがあれば、比較的楽にwebスクレイピングを行うことが出来ると思います。
    また、数多くのメソッドがあるので、そちらを利用すればより快適に利用することが出来るかもしれません。
    参考:: Ruby-docs::Mechanize

    補足: ユーザーエージェントの指定

    webページにアクセスする際に、ユーザーエージェントを指定することが出来ます。
    以前コードを書いた時は文字列で指定したのですが、エイリアスを利用して簡単に指定出来るようです。

    agent = Mechanize.new
    #文字列でのUAの指定
    agent.user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 Mobile/14F89 Safari/602.1"
    
    #エイリアスを利用したUAの指定
    agent.user_agent_alias = "iPhone (iOS 9.1)"
    
    

    おわりに

    Rubyの便利なgem、mechanizeを紹介させていただきました。
    他にもスクレイピングするのに便利なgem等ありましたら、ご紹介いただけるとうれしいです。