こんにちは、学生エンジニアのkoyamaです。
今回はスクレイピング初心者にとって便利なgemを紹介します。

スクレイピングを行うときに、「CSSセレクタをちゃんと設定したつもりなのに欲しい内容が取得できないよ!」というときがありませんか?
こういうときにオススメしたいgemがpryです。
Pryを使うことで任意の場所で一旦プログラムの実行を止めて、それぞれの値を確認することができます。

pryを使ってみる

まずはpryを実際に使ってみましょう。
require 'pry'

a = [1,2,3,4]
a.each do |i|
puts i
end

これを実行するとeachでの処理一回ごとにプログラムが停止します。
1: require 'pry'
2:
3: a = [1,2,3,4]
4: a.each do |i|
5: binding.pry
6: puts i
7: end

[1] pry(main)> i
=> 1
1回目の呼び出しの時にiを確認すると確かに1が代入されているのがわかりました。
このようにプログラムを一旦止めて対話的に値の確認ができるのがとても便利ですね。

pryの活用方法

ここで、自分がスクレイピングの時によく使うpryの使い方のいくつかを紹介したいとおもいます。

まずは欲しい値を探している時にプログラム上の任意の場所で止めて値を確認するという使い方です。
require 'pry'
require 'nokogiri'
html =<<-"EOF"
<html>
  <head>
    <title>タイトル</title>
  </head>
  <body>
    <div>
      <table>
        <h1>欲しい内容</h1>
      </table>
    </div>
  </body>
</html>
EOF
doc = Nokogiri::HTML.parse(html, nil, "utf-8")
binding.pry
今回はNokogiriを使ってスクレイピングしている時を想定します。
サイトのhtmlの中にある欲しい内容や値を探す時にpryが役に立ちます。
また、このコードではHTMLの構造を変数htmlに渡してNokogiriでパース、その後pryで止めて終了という流れです。
 
[1] pry(main)> doc.text
=> "\n \n \n タイトル\n \n \n \n \n 欲しい内容\n \n \n\n \n"
[2] pry(main)> doc.css('table h1').text
=> "欲しい内容"
[3] pry(main)> doc.css('title').text
=> "タイトル"
pryで止めている時に、doc.css('table h1').textのようにcssセレクタを指定してあげると文字列が帰ってきました。
pryで一旦止めてから、cssセレクタを使ってどの値が得られるのかをが確かめられるのがとても便利です。
クロールするサイトをデベロッパーツールを使って見れば欲しい値のcssセレクタがわかりますが、同じタグが複数個ある時に引数を指定する必要がある場合があるので、そんな時にpryで1つずつ確認して行けばピンポイントで値を指定できるのも強みです。

次にエラーが出てしまう行にpryを挟み込んでエラーの原因を探るという使い方です。
require 'pry'

begin
  a = 10/0
rescue => e
  binding.pry
end
今回はエラー出力を変数eに渡しておきます
1: require 'pry'
2: begin
3: a = 10/0
4: rescue => e
=> 5: binding.pry
6: end

[1] pry(main)> e
=> #
このようにeの中身のエラー出力を見ることができます。
自分はエラーの起きている行にpryを挟み込んで、具体的にどこの値がおかしいのかを調べることでエラーの原因を見つけるという使い方をよくします。

他にもpryで止めている時にJavascriptを実行して値を見たりと、様々な使い方ができるpryをぜひ活用してみてはいかがでしょうか?