

### 前提・実現したいこと

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

ローカルでの動作です。  
Heroku上で動作させると、同じアドレスでも500エラーで返ってきます。  
[![画像の説明をここに入力](https://i.stack.imgur.com/moOLR.gif)](https://i.stack.imgur.com/moOLR.gif)

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

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

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

[動作の流れ]

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

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

Mechanizeで検知しようとした先から500エラーが返ってきているのが原因だと思います。  
こちらの原因や対処法など、何かありましたらご教示お願いします。

**[ローカルのログ]**

[code]

    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)
    
[/code]

**[Herokuのログ]**

[code]

    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'
    
[/code]

### 該当のソースコード

**[htmlフォーム]**

[code]

    = 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"
    
[/code]

**[JS]**

[code]

    $(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には対応していません。");
              }
          });
      });
    });
    
[/code]

**[contoroller]**

[code]

      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
    
[/code]

**[gemfile]**

[code]

    gem 'mechanize'
    
[/code]

**[ルートファイル]**

[code]

    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
    
[/code]

**[scraping.novel.js.erb]**

[code]

    <%= @novel_title %>delimiter<%= @novel_description %>
    
[/code]

### 試したこと

  * GETをPOSTにして試してみましたがダメでした
  * `require 'mechanize'` と `require 'nokogiri'` を入れてもダメでした
  * `heroku restart` も試しました
  * `rake assets:precompile`
  * `config.assets.compile = true` と `false` の切り替え

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


CC BY-SA 4.0
2018-07-06T02:42:39.160
45348
2020-09-17T16:04:40.543
2019-06-05T03:10:50.407
32986
29198
question
ruby-on-rails heroku rubygems mechanize
Rails+MechanizeでHeroku上でスクレイピングした時に500エラー


ログに以下のエラーがあるので、heroku(Mechanize)からncode.syosetu.comにアクセスした時に、ncode.syosetsu.comから503エラー(Service
Temporarily Unavailable)が返却されたと思います。

> Mechanize::ResponseCodeError (503 => Net::HTTPServiceUnavailable for  
>  <https://ncode.syosetu.com/n5011em/> -- unhandledresponse):

そのため、コードに問題はなく、ncode.syosetsu.com側の問題だと思います。  
(一時的に停止していたか、heroku経由のアクセスを禁止しているかなど)


CC BY-SA 4.0
2018-07-06T03:03:12.187
45350
2018-07-06T03:03:12.187
45348
answer