RubyKaigi2022の方に参加してきまして、そちらの方で「debug」というツールの話を聞きそういえば一生pコマンド
で出力していたと思い試して見たくなりました。
ということで実際触ってみての感想とかを書いていきます。
前準備
今回使ったコードはこちら
Gemfile
source 'https://rubygems.org'
gem 'nokogiri'
gem 'debug'
crawler.rb
require 'net/http'
require 'uri'
require 'nokogiri'
require 'kconv'
def main
uri = URI.parse("https://qiita.com/itaya")
request = Net::HTTP::Get.new(uri)
req_options = {
use_ssl: uri.scheme == "https",
}
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(request)
end
doc = Nokogiri::HTML.parse(response.body.toutf8, nil, 'utf-8')
p '###HTMLタイトル取得###'
p doc.title
end
main
$ bundle install --path .bundle
$ bundle exec ruby crawler.rb
"###HTMLタイトル取得###"
"itaya - Qiita"
何をしてるコードかというと、Qiitaの自分のページの情報をとってきてそのタイトルを取得するという簡単なものです。
使ってみる
crawler.rb
require 'net/http'
require 'uri'
require 'nokogiri'
require 'kconv'
def main
uri = URI.parse("https://qiita.com/itaya")
request = Net::HTTP::Get.new(uri)
req_options = {
use_ssl: uri.scheme == "https",
}
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(request)
end
doc = Nokogiri::HTML.parse(response.body.toutf8, nil, 'utf-8')
p '###HTMLタイトル取得###'
p doc.title
debugger
end
main
こんな感じでdebuggerを仕込みまして
$ bundle exec ruby -r debug crawler.rb
デバッグモードで実行すると
"###HTMLタイトル取得###"
"itaya - Qiita"
[16, 24] in crawler.rb
16| end
17|
18| doc = Nokogiri::HTML.parse(response.body.toutf8, nil, 'utf-8')
19| p '###HTMLタイトル取得###'
20| p doc.title
=> 21| debugger
22| end
23|
24| main
=>#0 Object#main at crawler.rb:21
#1 <main> at crawler.rb:24
(rdbg)
このような画面が表示されるかと思います。
これでブレークポイントで止まってるのがわかるかと思います。
ここでいろいろなコマンドが入力できまして、
n: 次の行へ
s: 次のステップへ
などいろいろできます。
詳しいコマンド一覧はこちらです
https://github.com/ruby/debug
rubyのコードを追加で実行してみる
上記の状態でコマンド一覧以外の入力をするとrubyのコードとして解釈され実行できます。
doc.text
と入力すると、docに入っているテキスト情報が取れたりします。
まとめ
スクレイピングのコードとかだと毎回pで出力確認していると都度コードを実行してデータ取得からやり直す必要があったんですけど、これならとってきたあと色々ゴニョゴニョすることができてやりやすそうに感じました!