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

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

ただいまの
回答率

91.36%

  • Ruby

    5198questions

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

  • Ruby on Rails

    5081questions

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

  • Ruby on Rails 5

    93questions

RoRでスクレイピングでページを作ってみたい

解決済

回答 2

投稿 2017/12/05 03:17

  • 評価
  • クリップ 0
  • VIEW 96

ninpig04

score 8

私は現在Ruby on Railsを使ってサービス開発をしています。
中高生向けのサービスを作っており、学校ごとのページをつくりたいのですが、自分で全てのページを作ると大変なので、スクレイピングというものをやってみようと思いました。

ページの構成としては
トップページから、学校選択の画面に飛び、そこから中学校か高等学校を選択することによって、全国の中学校情報、あるいは高等学校情報が都道府県別に並び、クリックすることで自分の学校にたどり着けるというものです。

現在、ルーティングはこのようになっています

    get "school/index" => "school#index"
    get "school/junior" => "school#junior"
    get "school/high" => "school#high"

indexのviewはこうなっています。

<h1>学校を探しましょう</h1>
<p><%= link_to("中学校一覧", "//") %></p>
<p><%= link_to("高等学校一覧", "//") %></p>

中学校と高校の一覧を表示するviewも用意していますが、白紙です。
で、中学校のページに関してはhttps://www.gakkou.net/chugaku/search/area.html
高等学校のページに関しては
https://www.gakkou.net/kou/search/area.html
をスクレイピングして、自分のサービスでもこれと同じようにしてユーザーが自分の学校を検索できるようにしたいと考えています。

しかし、スクレイピングのやり方がよくわからず、コントローラは以下のようになっているのですが、

class SchoolController < ApplicationController
  def index
      for n in 1..47 do
          for m in 1..10 do #10 は適当
           GET https://www.gakkou.net/chugaku/src/?p={n}&pnum={m}
              処理
          end
    end
  end

  def junior
      end

  def high
      end

end

ここから先、具体的にどうすれば良いのかわかりません。
この先どうすれば良いか、ご教授願います。

OS:mac 
Ruby 2.3.3
Rails:5.0.5

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

スクレイピングは相手のサイト、サーバに負荷をかける行為です。
まずはこれを認識しましょう。
したがって、コントローラでリアルタイムにスクレイピングするのはダメです。
Librahack事件など、スクレイピングを行ったために逮捕された事例もあります(後に不起訴となりましたが、長期間拘留される事になりましたし、私生活に影響が起きています)
私も、もし定期的に自分のサイトにスクレピングを仕掛けて来る輩がいたら訴えないまでも、IPやユーザエージェント、アクセス間隔でブロックします。
スクレピングって結局、コンテンツ泥棒ですから、当然の反応でしょう。

これはスクレイピングされる側のサイトのポリシーによって反応が違いますので、スクレイピングをするなというのではありません。
もし、スクレピングをやるのであれば、最低限、常識の範囲でアクセスしてほしいと思います。
例えば、1秒に1回、2秒に1回など相手に負担を掛けない程度の間隔を空けてアクセスしてほしいです。
また、今回のようにコントローラにアクセスされたら、相手のサイトにスクレイピングする=アクセスするといったリアルタイムのアクセスもやめて欲しいです。

データ収集はバッチで行い一度CSVなどに保存した上で、データベースに登録し、
自分のサイトでは、データベースから読み出して表示します。
データ収集は、3か月に1回などそのくらいのペースで更新すればいいと思います。
あとは管理画面を用意して、手動で独自のデータも追加できるようにするといいですね。

投稿 2017/12/05 09:48

編集 2017/12/05 10:09

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/05 10:56

    なるほど、データベースから読みだして表示する方法なら逮捕されることなく、上記のサイトの通りのページ構成を実現できますか?
    データ収集はバッチで行い、CSVなどに保存した上でデータベースに登録し…とありますが、これはスクレイピングではないのですか?
    また具体的な手順についても教えていただけるとありがたいです

    キャンセル

  • 2017/12/05 11:03

    データ収集してDBに登録するのも当然スクレイピングです。
    ただ、スクレイピングするなというと話が終わってしまいます。
    質問者さんの希望に沿うように、どうしてもスクレイピングするならば最低限気を付けて欲しい事を書きました。

    スクレイピングをしたら即逮捕とかブロックされるという事ではありません。
    相手のポリシー次第です。
    たとえば、今回の場合プライバシーと免責事項のページに記載があります。
    https://info.gakkou.net/rex/rex9.html

    >アンテナプログラムなどによるナレッジステーションホームページへの更>新チェックは、常識的な範囲でお願いします(1日に100回も更新チェックをかけないでください)。過度な頻度でアクセス・取得することはご遠慮ください。
    >特定IPアドレスからの過度なアクセスが認められた場合、予告なしに当該IPアドレスからのアクセスを拒否させていただく場合もございます。

    スクレイピングも更新チェックと同じですからこれに該当します。
    つまり、1日100回程度でもうダメという事です。
    もちろん、これはこういう風にしてくれというお願いなので、スクレイピングのバッチを作ってアクセスした場合100回ちょうどでブロックされるという事ではないでしょう。

    一般的に考えると回数というよりも、頻度の問題です。

    キャンセル

  • 2017/12/05 11:07

    rubyでスクレイピングをする場合、nokogiriというgemを使うと良いと思います。
    使い方は、rails nokogiriなどで探せます。
    例えばこんな記事があるので参考にしてください。

    https://www.sejuku.net/blog/13230

    キャンセル

  • 2017/12/05 11:09

    なるほど、調べてみます
    バッチ処理の場合更新チェックは1回ということになるのでしょうか?

    キャンセル

  • 2017/12/05 11:12

    リクエスト回数です。
    例えば、特定のURLを解析するためにGetリクエストを1回送信したら、これで1回とみなされます。
    参考にあげた記事の場合、html = open(url)を実行した時点で1回です。

    キャンセル

  • 2017/12/05 11:14

    なので、通常はキャッシュ機構を自作して一度アクセスしたURLのHTMLをローカルに保存しておき、同じURLに対してはローカルのHTMLを返すといった機能を用意して、可能な限り先方にアクセスしないようにします。
    特にスクレイピングは、HTMLの構造によってプログラムを変える必要があるため、試行錯誤する事になります。
    それを繰り返しているうちに簡単に100回を超えてしまいますので、同じURLに対しては1回だけしかアクセスしないように工夫してください。

    キャンセル

  • 2017/12/05 11:52

    わかりました。またわからないことがあれば質問します。

    キャンセル

0

Rails というgem (ライブラリ)を利用してWeb アプリケーションが(比較的)簡単に作れるのであれば また、Web ページの情報をコードを書いて取得・加工するライブラリも、だれか(あるいは自分自身の手で)作成しているのです

そうした発想をもって、(英語を恐れず)検索してみると、次のようなライブラリを見つけることも不可能ではないはずです

詳細については、各ページを参照してみてください

あるいは「ruby gem scraping github」で検索してみると、他にも見つけられるかもしれません

簡単に調べてみましたが、何か参考になれば幸いです

投稿 2017/12/05 06:35

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • Ruby

    5198questions

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

  • Ruby on Rails

    5081questions

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

  • Ruby on Rails 5

    93questions