質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1645閲覧

Mechanizeのスクレイピングについて。末尾が連番のURLをまとめて取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/01/05 05:36

スクレイピングをするときに、末尾が連番で増えるURLをまとめて取得したいです。

下記の#{0301 + i}という記述で、eachメソッドを使って、数を増やしています。
しかし、エラーで上手く機能しません。

連番URLの取得はどのようにすれば実現可能でしょうか。

require 'mechanize' def scraping_image(link) agent = Mechanize.new page = agent.get(link) image_url = page.at('.products-mainImg img').get_attribute('src') return image_url end links = [] # 個別ページのリンクを保存する配列 agent = Mechanize.new (0..3).each do |i| current_page = agent.get("http://www.morinaga.co.jp/products/list.php?id=#{0301 + i}") elements = current_page.search('.products__list__item a') elements.each do |ele| links << ele.get_attribute('href') end end links.each do |link| puts scraping_image('http://www.morinaga.co.jp/products/' + link) end

ちなみに、連番は無視して1つのURLを取得する下記のコードは正常に機能しています。

require 'mechanize' def scraping_image(link) agent = Mechanize.new page = agent.get(link) image_url = page.at('.products-mainImg img').get_attribute('src') return image_url end links = [] # 個別ページのリンクを保存する配列 agent = Mechanize.new current_page = agent.get("http://www.morinaga.co.jp/products/list.php?id=0301") elements = current_page.search('.products__list__item a') elements.each do |ele| links << ele.get_attribute('href') end links.each do |link| puts scraping_image('http://www.morinaga.co.jp/products/' + link) end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

別解がいろいろあるのがRubyの特徴ですね

rb

1 (301..304).each do |i| 2 current_page = agent.get("http://www.morinaga.co.jp/products/list.php?id=%04d" % i)

投稿2018/01/05 06:08

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは

ruby

1#{0301 + i}

の部分を、

ruby

1#{'030' + (1+i).to_s }

と修正すれば、この部分が '0301'...'0304' という文字列になると思います。

ちなみに、たとえば i = 1 のとき、"#{0301 + i}" は以下のように
"194" という文字列になります。

mansion-market_2 (feature/issue-7132-dev2)$ irb

irb(main):001:0> i=1
=> 1
irb(main):002:0> "#{0301 + i}"
=> "194"
irb(main):003:0>

これは、0301 が8進数として評価され、それは10進数では、193 だからです。

irb(main):003:0> 0301

=> 193

さらに別の修正のしかたとして、

ruby

1(0..3).each do |i| 2 current_page = agent.get("http://www.morinaga.co.jp/products/list.php?id=#{0301 + i}")

を、

ruby

1(1..4).each do |i| 2 current_page = agent.get("http://www.morinaga.co.jp/products/list.php?id=030#{i}")

とするのがより分かりやすいと思いますがいかがでしょう。

以上参考になれば幸いです。

投稿2018/01/05 05:47

編集2018/01/05 05:57
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/05 06:07

バッチリ取得できました!くわしい解説、誠にありがとうございます。
jun68ykt

2018/01/05 09:00

解決したようで、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問