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

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

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

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

Ruby

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

Heroku

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

Ruby on Rails

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

Q&A

解決済

1回答

1544閲覧

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

Kochan

総合スコア56

Ruby on Rails 5

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

Ruby

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

Heroku

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/07/03 18:34

編集2018/07/03 18:48

前提・実現したいこと

フォームに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フォーム

haml:html.haml

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

JS

javascript:application.js

1$(document).on('turbolinks:load',function(){ 2 $("#get-novel-info-button").click(function(){ 3 $.ajax({ 4 url: "scraping_novel", 5 type: "GET", 6 data: { url : $("#modal-novel-url").val() 7 }, 8 dataType: "html", 9 success: function(data) { 10 console.log('success'); 11 console.log(data); 12 // app/views/matomes/scraping_novel.js.erb 13 //上記ファイルの中身を文字列"delimiter"で分ける 14 var split_datas = data.split("delimiter"); 15 $("#modal-novel-title").val(split_datas[0]); 16 $("#modal-novel-description").val(split_datas[1]); 17 }, 18 error: function(data) { 19 console.log('error'); 20 alert("URLが不正、もしくはこのURLには対応していません。"); 21 } 22 }); 23 }); 24});

contoroller

ruby:matomes_contoroller.rb

1 def scraping_novel 2 require 'mechanize' 3 require 'nokogiri' 4 5 agent = Mechanize.new 6 page = agent.get(params[:url]) 7 @novel_title = page.at('.novel_title').inner_text 8 @novel_description = page.at('#novel_ex').inner_text 9 10 respond_to do |format| 11 format.js 12 end 13 end

gemfile

ruby:gemfile

1gem 'mechanize'

ルートファイル

ruby

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

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の切り替えも試しましたがダメでした。

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

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

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

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

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

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

guest

回答1

0

自己解決

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

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

投稿2018/07/07 17:32

Kochan

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問