Rails+MechanizeでHeroku上でスクレイピングした時に500エラー
前提・実現したいこと
フォームに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
の切り替え
何か他のファイルの情報などが必要であればおっしゃってください。
すぐに対応させていただきます。
よろしくお願いします。