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

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

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

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

Q&A

解決済

1回答

957閲覧

Ruby on Rails Mechanizeを利用し複数にまたがるページをスクレイピングしたい。

HIDAKA.K

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/12 14:42

前提・実現したいこと

プログラミング初心者です。質問も的を得ていなかったり、至らないところばかりだと思いますが、よろしくお願いします。
Ruby on RailsのMechanizeで複数のぺージにまたがるサイトの情報をスクレイピングしデーターベースに保存したく、ネット上にあった情報(下のコード)を基に、サイトのurlや、searchメソッドの要素を変更してみたのですが、うまくいきません。
恐らく、スクレイピングしようとしているサイトのaタグの扱いがうまくいっていないのだと思います。サイト1ページ目のaタグを含む一行は
<a href="javascript:void(0)" data-page-num="1" id="nextPage">次へ</a>
です。
2ページ目以降はサイトのURLは変わらず、aタグ内のdata-page-num=""内の数字が、2、3と増えていく形です。

該当のソースコード

Ruby

1require 'mechanize' 2 3class Scraping 4 def self.fuga_urls 5 agent = Mechanize.new 6 links = [] 7 next_url = "" 8 9 while true 10 current_page = agent.get("https://hoge.com/fuga/" + next_url) 11 elements = current_page.search('.fuga-title a') 12 elements.each do |ele| 13 links << ele.get_attribute('href') 14 end 15 16 next_link = current_page.at('.pagination .next a') 17 break unless next_link 18 next_url = next_link.get_attribute('href') 19 end 20 21 links.each do |link| 22 get_book('https://hoge.com/fuga' + link) 23 end 24 end 25 26 def self.get_book(link) 27 agent = Mechanize.new 28 page = agent.get(link) 29 30 title = page.at('.fuga-title').inner_text if page.at('.fuga-title') 31 32 book = Book.where(title: title).first_or_initialize 33 book.save 34 end 35end

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

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

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

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

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

guest

回答1

0

ベストアンサー

2ページ目以降はサイトのURLは変わらず

ということであれば、JavaScriptでページ内容を書き換えているのでしょうから、Mechanizeは対応できません(JavaScriptを解釈できない)。

JavaScript必須のページに対しては、Seleniumライブラリを使ってブラウザ(ChromeとかFirefoxとか)をコントロールするのが一般的なようです。
このサイトでも、Python + Selenium の質問は山ほどあります。Ruby + Selenium の質問はPythonに比べると少ないですが、RubyがSeleniumに向かないと言うことでは無いです。使い慣れた言語を使いましょう。

投稿2020/04/12 16:11

otn

総合スコア84555

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

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

HIDAKA.K

2020/04/13 04:09

回答ありがとうございます。 まだまだ分からないことが多いので、非常に助かりました! アドバイスを基に、いろいろと試していきます。 本当にありがとうございました。
otn

2020/04/13 04:16

Railsということですが、ウェブのリクエストに応じてスクレイピングするのだとすると、ブラウザ起動はちょっと重いかも知れません。難しいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問