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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

2325閲覧

mechanizeスクレイピングで次のページで行く方法

KOO_

総合スコア58

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

1クリップ

投稿2019/08/17 08:22

編集2019/08/18 09:27

現在mechanizeを使用してスクレイピングを行なっております。

下記はindexからshowへアクセスし、対象の文字をスクレイピングしています。

require 'rubygems' require 'mechanize' a = Mechanize.new { |agent| agent.user_agent_alias = "#"} page = a.get("#") urls = a.page.css("...").css("a").map { |x| +x["href"]} #sleep 5 urls.each { |x| p x begin a.get(x); p a.page.css("#").css("a").text(); #タイトル p a.page.css("#")[1].text(); #住所 p a.page.css("#").text(); #自社URL p a.page.css("#")[2].text(); #人数 sleep 5; rescue => e p e end p "" }

ここから全て取得完了したらpagenateの『次のページ』へアクセスし、同様に次のページでも取得出来るようにしていきたいです。

その取得は再度eachを回すことはわかるのですが、どこにどのようにeachを入れれば動くのでしょうか?

どなたか教えてもらえると幸いです。

よろしくお願い致します。

require 'rubygems'
require 'mechanize'
a = Mechanize.new { |agent| agent.user_agent_alias = "#"}
page = a.get("#")
urls = a.page.css("...").css("a").map {
|x| +x["href"]}

urls = []

loop do
urls.concat
break unless page
page = page.link_with(text: '次のページ').click
end

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/17 09:56

過去質問を見たところ、質問を放置する方のようなので回答は控えます。
退会済みユーザー

退会済みユーザー

2019/08/17 16:13

1. 記事一覧のURLを全て取得して配列にする 2. URLの配列をループして各ページを開き文字列を取得する 3. URLの配列分すべて処理したら、1に戻る(次のページへ) ということをしたいのでしょうか?
KOO_

2019/08/18 04:38

User1様 お返事頂きありがとうございます。 おっしゃる通りです。 3部分がどう配置して良いのか分からなく、ご教示頂きたいです。 よろしくお願い致します。
guest

回答1

0

ベストアンサー

実際のページの構造が分からないので動作確認をしていません。

以下の箇所で記事一覧の全URLを取得していると思います。

Ruby

1page = a.get("#") 2urls = a.page.css("...").css("a").map { 3 |x| +x["href"]} 4

この箇所で記事一覧(複数ページ)の全URLを取得するように変更すればよいと思います。

Ruby

1urls = [] 2 3loop do 4 urls.concat(pageの全urlを取得) 5 break unless page に「次のページ」が存在する 6 page = page.link_with(text: '次のページ').click 7end 8

「クリックでページ遷移する」方法は以下の記事を参照してください。

参考:
Mechanizeでサイトログインしてスクレイピングするときのアレコレ メモ

追記:

Ruby

1# 記事一覧1ページ目 2page1 = <<-PAGE 3 url01 4 url02 5 url03 6PAGE 7 8# 記事一覧2ページ目 9page2 = <<-PAGE 10 url04 11 url05 12 url06 13PAGE 14 15 16 17# 現行(単一ページのurlを取得 -> 処理) 18urls = page1.split("\n") # urlの一覧取得 19 20urls.map(&:strip).each do |url| 21 puts url 22 puts 'タイトル', '住所', '自社URL', '人数' 23 puts '-' * 20 24end 25 26puts '*' * 20 27 28# 新規(複数ページのurlを取得 -> 処理) 29page = 'page1' 30urls = [] 31 321.step do |i| 33 urls.concat(eval("#{page}.split(\"\n\")")) # 現ページのurlの一覧取得 34 break unless eval("defined? page#{i + 1}") # 次のページがなければbreak 35 page = "page#{i + 1}" # 次のページを開く 36end 37 38urls.map(&:strip).each do |url| 39 puts url 40 puts 'タイトル', '住所', '自社URL', '人数' 41 puts '-' * 20 42end 43

投稿2019/08/18 05:50

編集2019/08/18 10:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KOO_

2019/08/18 09:29

回答ありがとうございます。 投稿内容下部に修正を記載しましたが、こういうことでしょうか? **.rb:15:in `block in <main>': undefined method `click' for nil:NilClass (NoMethodError) この場合、clickがnilとのことでエラーが発生してしまうようです、、よろしくお願い致します。
退会済みユーザー

退会済みユーザー

2019/08/18 10:49 編集

恐らく、html上に「次のページ」を含む要素が存在しないのでしょう。 回答に記述した通り、現行の記事一覧(単一)の全URLを取得する処理を、 作り変える想定なので質問に追記していただいたコードは私の考えとは違います。 回答に処理イメージを追記しました。
KOO_

2019/08/18 13:16

ありがとうございます。自分にはなかなかまだ難しくて理解出来ないので勉強してみようと思うのですが、最後にrubyで参考となるようなサイトはございますでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/19 11:42 編集

・入門 書籍:「たのしいRuby 第6版」 https://tanoshiiruby.github.io/6/ サイト:「Ruby入門」 https://www.javadrive.jp/ruby/ サイト:「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」     https://wa3.i-3-i.info/ ・クローラー(KOO_さんが作ろうとしているプログラムの総称) 書籍:「Rubyによるクローラー開発技法」 https://www.sbcr.jp/product/4797380354/ ※プログラミングに関する基礎的な知識があったほうが理解しやすいと思う。 サイト:「XPATHの記法まとめ」 https://qiita.com/rllllho/items/cb1187cec0fb17fc650a ※CSSセレクタだけを使うなら不要。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問