前提・実現したいこと
Ruby on Rails でスクレイピングをして取得したデータをデータベースに格納するRakeタスクを作っています。
発生している問題・エラーメッセージ
まず、Rakeタスクを作る前に、単なるRubyでスクレイピングするプログラムを作りました。それを、Rakeタスクに移植して実行してみたのですが、出力されたデータが異なりました。
おそらく、スクレイピングで取得したHTMLが異なるのかと思うのですが、なぜ異なる結果が返されるのかがわかりません。これについてご教授いただけると幸いです。
該当のソースコード
以下のコードがまず始めにRubyで書いたものです。申し訳ないのですが、スクレイピングしているサイトのアドレスやCSSセレクタはダミーです。
Ruby
1require "mechanize" 2agent = Mechanize.new 3agent.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" 4page = agent.get("https://example.com") 5 6price_list = [] 7item_list = [] 8 9replace = { 10 "\n" => "", 11 "\r" => "", 12 "\t" => "", 13 " " => "" 14} 15items = page.search("td.item") 16items.each do |d| 17 d = d.text 18 replace.each{|before, after| d.gsub!(before, after)} 19 item_list << d 20end 21 224.times do |i| 23 prices = page.search("table.price0#{i+1} td") 24 prices.each_with_index do |p, j| 25 next unless j % 10 == 0 26 price_list << p.text.gsub(/[^0-9]/,"").to_i 27 end 28end 29 30p item_list.zip(price_list).to_h
これをRakeタスクにしたものが以下です。
Ruby
1namespace :site do 2 desc "サイトから値段を取得" 3 4 task :get_prices => :environment do 5 prices = get_prices 6 p prices 7 p prices.length 8 end 9 10 def get_prices 11 agent = Mechanize.new 12 agent.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" 13 page = agent.get("https://www.onamae.com/service/d-regist/price.html") 14 15 price_list = [] 16 item_list = [] 17 18 replace = { 19 "\n" => "", 20 "\r" => "", 21 "\t" => "", 22 " " => "" 23 } 24 items = page.search("td.item") 25 items.each do |d| 26 item = d.text 27 replace.each{|before, after| item.gsub!(before, after)} 28 item_list << item 29 end 30 31 4.times do |i| 32 prices = page.search("table.price0#{i+1} td") 33 prices.each_with_index do |p, j| 34 next unless j % 10 == 0 35 price_list << p.text.gsub(/[^0-9]/,"").to_i 36 end 37 end 38 39 item_list.zip(price_list).to_h 40 end 41end
試したこと
ユーザーエージェントがRailsか何かに書き換えられているのではと思い、明示的に指定するようしました。
Mechanizeのユーザーエージェントを変更する。=>変わらず
補足情報(FW/ツールのバージョンなど)
mechanize
Rails 6.0.1
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19]
Mechanize 2.7.6
回答2件
あなたの回答
tips
プレビュー