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

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

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

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

Q&A

解決済

1回答

798閲覧

mechanizeで複数サイトをスクレイピングする際の最適な方法が知りたい。

AkiDatsugoku26

総合スコア35

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/12/22 01:57

前提・実現したいこと

mechanizeを使ってニュースサイトの情報をスクレイピングしています。

1つのサイトは下記のコードで問題なく必要な情報を抽出できていますが、
このサイトとは別のサイトから新たに情報を取ってきた場合のコードの書き方がわからず、
悩んでいます。

該当のソースコード

model

1require 'mechanize' 2 3class Scraping < ApplicationRecord 4 5 def self.fuga_urls 6 links = [] 7 agent = Mechanize.new 8 9 current_page = agent.get("https://https://xxxxxxxx/xxxxxxxx/xxxxxxxx/") 10 elements = current_page.search('.ranking-list .item a') 11 sleep 2 12 elements.each do |ele| 13 links << ele.get_attribute('href') 14 end 15 16 links.each do |link| 17 get_scraping('https://xxxxxxxx/' + link) 18 end 19 20 end 21 22 def self.get_scraping(link) 23 agent = agent = Mechanize.new 24 page = agent.get(link) 25 26 title = page.at('.arti-header .head').inner_text 27 sleep 2 28 image_url = page.at('.figure-area img')[:src] if page.at('.figure-area img') 29 sleep 2 30 detail = page.at('.arti-summary').inner_text 31 sleep 2 32 page = link 33 sleep 2 34 category = "hoge" 35 36 scraping = Scraping.new(title: title, image_url: image_url, detail: detail, page: page, category: category) 37 scraping.save 38 end 39end

試したこと

モデルを新しく作ればとってこれると思うのですが、10個くらいのサイトでスクレイピング
を試したいと考えているので断念しました。

またグノシーなどニュースサイトのまとめアプリはいくつかありますがそれらのサービスがいくつもモデルをつくっているとは思えません。
理想は1つのモデルで完結させることですが「こっちのほうが良い!」など別の案も是非教えてほしいです。

新たに変数をつくることも考えたのですがこちらもコードがとても長くなりそうなので、
いったんこちらで質問してみました。

変数current_pageを繰り返し処理で入れ替えるなどはできるでしょうか。
良い案がございましたら是非ご助言いただけると嬉しいです!

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

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

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

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

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

guest

回答1

0

自己解決

こちら自己解決できましたので共有します。

結論からですが上記のモデルに新しくアクションを追加することで解決しました。
下記上手くいったコードを記載します。

model

1require 'mechanize' 2 3class Scraping < ApplicationRecord 4 # 漫画・アニメ 5 6 def self.fuga_urls 7 links = [] 8 agent = Mechanize.new 9 10 current_page = agent.get("https://xxxxxxxx.jp/xxxxx/xxxxx/") 11 elements = current_page.search('.ranking-list .item a') 12 sleep 2 13 elements.each do |ele| 14 links << ele.get_attribute('href') 15 end 16 17 links.each do |link| 18 get_scraping('https://xxxxxxxxxx/' + link) 19 end 20 end 21 22 def self.get_scraping(link) 23 agent = agent = Mechanize.new 24 page = agent.get(link) 25 26 title = page.at('.arti-header .head').inner_text 27 sleep 1 28 image_url = page.at('.figure-area figure img')[:src] if page.at('.figure-area figure img') 29 sleep 1 30 detail = page.at('.arti-summary').inner_text 31 sleep 1 32 page = link 33 sleep 1 34 category = "アニメ" 35 36 scraping = Scraping.new(title: title, image_url: image_url, detail: detail, page: page, category: category) 37 scraping.save 38 end 39 40 41 42 def self.hoge_urls 43 links = [] 44 agent = Mechanize.new 45 46 47 current_page = agent.get("https://xxxxxxxxx/xxxxxxx/xxxxxxxxx") 48 elements = current_page.search('.m-content-item .m-content-item-image a') 49 sleep 2 50 elements.each do |ele| 51 links << ele.get_attribute('href') 52 end 53 54 links.each do |link| 55 get_hoge('https://xxxxxxxxx' + link) 56 end 57 end 58 59 def self.get_hoge(link) 60 agent = agent = Mechanize.new 61 page = agent.get(link) 62 63 title = page.at('.m-article-header-title').inner_text 64 sleep 1 65 image_url = page.at('.m-article-eyecatch a img')[:src] if page.at('.m-article-eyecatch a img') 66 sleep 1 67 movie_url = page.at('.m-article-eyecatch iframe')[:src] if page.at('.m-article-eyecatch iframe') 68 sleep 1 69 page = link 70 sleep 1 71 category = "マンガ" 72 73 scraping = Scraping.new(title: title, image_url: image_url, page: page, category: category, movie_url: movie_url) 74 scraping.save 75 end 76end

これでそれぞれのアクションを実行すると欲しい情報を取ってこれました。

teminal

1rails c 2Loading development environment (Rails 6.0.0) 32.6.3 :001 > Scraping.fuga_urls

teminal

1rails c 2Loading development environment (Rails 6.0.0) 32.6.3 :001 > Scraping.hoge_urls

アクションを実行する際
Scraping.hoge_urlsとなっておりますがScrapingのところにはモデル名を入れてください。
selfはそのモデル自身を指すらしいので念のため注意です。

投稿2022/01/15 14:36

AkiDatsugoku26

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問