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

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

ただいまの
回答率

90.34%

  • Ruby

    8191questions

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

  • Ruby on Rails

    7671questions

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

  • Ruby on Rails 5

    2166questions

  • Heroku

    947questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Rails+MechanizeでHeroku上でスクレイピングがうまくいかない

解決済

回答 1

投稿 編集

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

Kochan

score 37

 前提・実現したいこと

フォームにURLを入力した時に、
Mechanizeを使い非同期でスクレイピングして情報を取得、
そのままjqueryを使い他のフォームへ情報を書き込みたいです。

ローカルでの動作です。
Heroku上で動作させると、同じアドレスでも500エラーで返ってきます。
イメージ説明

 発生している問題・エラーメッセージ

ローカルではうまく動いているものが、
Herokuに上げたら動かなくなってしまいました。

herokuのアドレスは以下です。
https://narou-matome.herokuapp.com/

[動作の流れ]
・フォーム入力
・jQueryで検知
・ajaxでパラメータ送信
・コントローラ上でMechanizeを動かして小説情報を取得
・js.erbファイル上で変数から取り出す
・jQueryで展開、代入

ローカル、Herokuそれぞれのログです。
Herokuから送って500エラーが返ってくるまでは同じです。

Mechanizeで検知しようとした先から500エラーが返ってきているのが原因だと思います。

[ローカルのログ]
Started GET "/matomes/scraping_novel?url=https%3A%2F%2Fncode.syosetu.com%2Fn5011em%2F" for 127.0.0.1 at 2018-07-04 02:32:07 +0900
Processing by MatomesController#scraping_novel as HTML
  Parameters: {"url"=>"https://ncode.syosetu.com/n5011em/"}
  Rendering matomes/scraping_novel.js.erb
  Rendered matomes/scraping_novel.js.erb (1.8ms)
Completed 200 OK in 3340ms (Views: 29.7ms | ActiveRecord: 0.0ms)

[Herokuのログ]
2018-07-03T17:37:10.330369+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf] Started GET "/matomes/scraping_novel?url=https%3A%2F%2Fn
code.syosetu.com%2Fn5011em%2F" for 125.12.18.156 at 2018-07-03 17:37:10 +0000
2018-07-03T17:37:10.331338+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf] Processing by MatomesController#scraping_novel as HTML
2018-07-03T17:37:10.331410+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf]   Parameters: {"url"=>"https://ncode.syosetu.com/n5011em
/"}
2018-07-03T17:37:11.088137+00:00 heroku[router]: at=info method=GET path= "/matomes/scraping_novel?url=https%3A%2F%2Fncode.syosetu.com%2Fn50
11em%2F" host=narou-matome.herokuapp.com request_id=5e294d36-10c4-48f1-a4af-30b33ef73acf fwd="125.12.18.156" dyno=web.1 connect=0ms service=
760ms status=500 bytes=1827 protocol=https
※ここで500エラーです
2018-07-03T17:37:11.086753+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf] Completed 500 Internal Server Error in 755ms (ActiveReco
rd: 0.0ms)
2018-07-03T17:37:11.091354+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf]
2018-07-03T17:37:11.091358+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf] Mechanize::ResponseCodeError (503 => Net::HTTPServiceUna
vailable for https://ncode.syosetu.com/n5011em/ -- unhandled response):
2018-07-03T17:37:11.091360+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf]
2018-07-03T17:37:11.091362+00:00 app[web.1]: [5e294d36-10c4-48f1-a4af-30b33ef73acf] app/controllers/matomes_controller.rb:74:in `scraping_no
vel'

 該当のソースコード

htmlフォーム

= form_for novel , :remote => true do |f|
  .form-group
    = f.label :"小説アドレス(小説名・あらすじをアドレスから自動入力します)"
    = f.text_field :url, placeholder:"小説アドレス", required: "required", id: "modal-novel-url", class: "form-control"

JS

$(document).on('turbolinks:load',function(){
  $("#get-novel-info-button").click(function(){
      $.ajax({
          url: "scraping_novel",
          type: "GET",
          data: { url : $("#modal-novel-url").val()
                  },
          dataType: "html",
          success: function(data) {
              console.log('success');
              console.log(data);
              // app/views/matomes/scraping_novel.js.erb
              //上記ファイルの中身を文字列"delimiter"で分ける
              var split_datas = data.split("delimiter");
              $("#modal-novel-title").val(split_datas[0]);
              $("#modal-novel-description").val(split_datas[1]);
          },
          error: function(data) {
              console.log('error');
              alert("URLが不正、もしくはこのURLには対応していません。");
          }
      });
  });
});

contoroller

  def scraping_novel
    require 'mechanize'
    require 'nokogiri'

    agent = Mechanize.new
    page = agent.get(params[:url])
    @novel_title = page.at('.novel_title').inner_text
    @novel_description = page.at('#novel_ex').inner_text

    respond_to do |format|
      format.js
    end
  end

gemfile

gem 'mechanize'

ルートファイル

Rails.application.routes.draw do
  get "matomes/scraping_novel"
  resources :novels
  resources :matomes
  devise_for :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'matomes#index'
end

scraping.novel.js.erb

<%= @novel_title %>delimiter<%= @novel_description %>

 試したこと

GETをPOSTにして試してみましたがダメでした。
また、require 'mechanize'とrequire 'nokogiri'はなくてもローカルで動いていましたが
試しに入れてみて、結局ダメでした。

heroku restartも試しました。

rake assets:precompileと
config.assets.compile = trueとfalseの切り替えも試しましたがダメでした。

何か他のファイルの情報などが必要であればおっしゃってください。
すぐに対応させていただきます。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

Rails5+heroku+nokogiriで特定のサイトのみスクレイピングが出来ない
https://teratail.com/questions/134715

上記で解決いたしました。
ありがとうございました!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Ruby

    8191questions

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

  • Ruby on Rails

    7671questions

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

  • Ruby on Rails 5

    2166questions

  • Heroku

    947questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。