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

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

ただいまの
回答率

90.76%

  • Ruby

    7035questions

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

Ruby HTTPBadRequestを解決したい

解決済

回答 1

投稿

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

artistan

score 15

 前提・実現したいこと

URLを入力し、URL先のwebページのスクリーンショットを取得するプログラムを作ろうと思います。
そこで、まずURL先のWEBページが存在するかを調べるメソッドを作成しました。
https://teratail.com/questions/125921#reply-191838
上記の質問で書いたコードが、以下になります。

require 'net/http'
require 'uri'

def url_exist?(uri, limit = 10)
  agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
  begin
    url = URI.parse(uri)
    Net::HTTP.new(url.host).get({"User-Agent": agent})
  rescue
    return false
  else
    return true
  end
end

puts url_exist?("http://www.nogizaka46.com/")
puts url_exist?("https://www.amazon.co.jp/")


これはあくまで、ページが存在しているかどうかを調べるもので、それに関しては大方問題なく動きました。

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

上のコードで、てっきりUser-Agentの設定がうまくいったのかと思ったのですが、そうではなかったようです。

puts Net::HTTP.new(url.host).get({"User-Agent": agent})


としてみると、結果は

#<Net::HTTPBadRequest:0x00007fffbdbfd910>


となり、User-Agentがよろしくないようです。
また、以下のコードも試してみました。

require 'net/http'

agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"

Net::HTTP.version_1_2
Net::HTTP.start('https://www.amazon.co.jp/', 80) { |http|
  response = http.get({"User-Agent": agent})
  response.body
}


結果は以下です。

Traceback (most recent call last):
        8: from url_html.rb:6:in `<main>'
        7: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:609:in `start'
        6: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:909:in `start'
        5: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:920:in `do_start'
        4: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:935:in `connect'
        3: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/timeout.rb:103:in `timeout'
        2: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/timeout.rb:93:in `block in timeout'
        1: from /home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:936:in `block in connect'
/home/user/.rbenv/versions/2.5.1/lib/ruby/2.5.0/net/http.rb:939:in `rescue in block in connect': Failed to open TCP connection to https://www.amazon.co.jp/:80 (getaddrinfo: Name or service not known) (SocketError)

恐らく、User-Agentの設定が間違えているのか?と思うのですが、どうも不足が見つかりません。
ご回答、アドバイスをいただけると幸いです。

 補足情報(FW/ツールのバージョンなど)

  • windows10
  • windows subsystem for linux(ubuntu)
  • ruby 2.5.1
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

get(url.path,{"User-Agent": agent})ですね。そう書いたはずですが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/13 20:01

    元質問のコメントに書きましたが、回答編集画面ではちゃんと
    get(url.path,{"User-Agent": agent})
    なのですが、質問画面で見ると、
    Net::HTTP.new(url.host).get(",{"User-Agent"=> IE11})
    になってしまっています。
    質問者さんの見間違いでは無かったようです。失礼しました。

    キャンセル

  • 2018/05/13 21:42

    なるほどです!
    確かに"url.path"を追加することで解決しました!
    何度もご回答いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ruby

    7035questions

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