• ベストアンサー
  • すぐに回答を!

Ruby net/httpについて

  • 質問No.7011589
  • 閲覧数360
  • ありがとう数2
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 17% (40/226)

Rubyで#!/ruby/bin/ruby

require 'net/http'
require 'uri'
print "content-type: text/html\r\n\r\n";

begin

url = "http://~~~.com/"
Net::HTTP.get_print URI.parse(url)

rescue => ex
print ex.class;
print "<hr />";
print ex.message;
print "<hr />";
print ex.backtrace;
end

というようなコードで指定のURLの内容をgetしたいと思っています。
が、とりあえずは上記内容でURL先の内容は取得できるのですが
url = "http://www.~~~.com";
という風にwwwをつけるとスクリプトがうごかずURL先の内容が取得できないのです。

原因はなんなのでしょうか?
識者のかたご教授ください。

質問者が選んだベストアンサー

  • 回答No.5
  • ベストアンサー

ベストアンサー率 81% (89/109)

ブラウザでアクセスすると、wwwの取れた方へリダイレクトかかりますよね?
Rubyでも、例えばこういった感じの物を動かしてみてください
https://ideone.com/Q5ZFR

何もいじらないと301が返りますし、その先を追いかけるようにすれば中身が取れます。
先日同じような話が出たので、詳細はこちらを参照して下さい
http://okwave.jp/qa/q6987202.html
補足コメント
1000vicki

お礼率 17% (40/226)

お礼の内容修正です。

ありがとうございました。

http.get()の返り値がNet::HTTPOKクラスのインスタンスでちょっと??となったんですが
Net::HTTPResponseのサブクラスだったりして、細かく追っていったりして
リファレンスをみながやら やってなんとか理解できました。
(※リファレンスだと明確にNet::HTTP#getの返り値はNet::HTTPResponseのオブジェクトだと
記載されているんですけど・・)

とにかく
非常にたすかりました。
投稿日時:2011/09/19 11:00
お礼コメント
1000vicki

お礼率 17% (40/226)

ありがとうございました。

http.get()の返り値がNet::HTTPOKとかでてきてちょっと??となったんですが
Net::HTTPResponseの返り値だったり
リファレンスをみながやら やってなんとか理解できました。

非常にたすかりました。・
投稿日時:2011/09/19 10:57

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 77% (490/633)

ANo.1とANo.2は全く間違ってました。
消せないので

irbでチェックしたので出力nilを見逃していました。
Net::HTTP.get_print URI.parse(url)の出力はnilですので変数で受けても全く意味が無かったです。
申し訳ございませんでした。

1.8.7の場合ですがマニュアル
http://doc.ruby-lang.org/ja/1.8.7/library/net=2fhttp.html
に例があります。
  • 回答No.3

ベストアンサー率 81% (89/109)

取り敢えず自分からは、出来るはず・・・としか言えないです。
事実、ruby1.9.2を用いて記載されたコードで次の2URIを対象にすると、どちらも出力があります。
http://google.co.jp # ただし、こちらにはリダイレクトがかかります。
http://www.google.co.jp


まず、切り分け材料を揃えた方が良いのではないでしょうか

point1:
 他のURIへ変更しても同じでしょうか?
 うまくいかないURIをブラウザへ入力するとアクセス出来ますか?
 直接telnet等からgetしてみるとどうでしょうか?
 リダイレクトはかかっていませんか?

point2:
 動かないというのは、具体的にどのような状況でしょうか
 せっかく例外捕捉して出力させているので、その内容からも追いかけてみましょう。
 詰まっているのは HTTP.get_print でしょうか、それとも URI.parse の部分でしょうか?
 パースして得られたオブジェクトの hostメソッドを叩くと、何が返りますか?
 また、この #host はRubyの外から nslookup 等で名前解決可能な物でしょうか?

point3:
 Rubyのバージョンや動作環境はどういったものですか?
 また、問題となっているURIは具体的に提示可能でしょうか?

<おまけ>
お勧め:
 文字列のリテラルは 'string' を優先させましょう。
 メタ文字が不要なシーンで "string" を使うのは、余計な紛れが入りかねません。

#1, #2:
 HTTP.get_print は、出力した後にnilを返すメソッドだと思います。
 マニュアルに明言はされていないようですが、「net/http.rb」のソースを覗いてみて下さい。
 1.8.7と1.9.2共に、最後にnilを明記しています。
 (多分、Kernelのprintに合わせたのではないでしょうか)
補足コメント
1000vicki

お礼率 17% (40/226)

実は、テストに私のブログのURLを用いてGETしようとしておりまして、
ただ私のブログのURLがwwwがあってもなくてもブラウザからはアクセスできるのです。

上記を踏まえて、実際にRubyのコードで実行すると
urlにwwwをつけたものだと、画面にはまったく何も表示されず
例外出力もされていないままなのです。
投稿日時:2011/09/15 07:46
  • 回答No.2

ベストアンサー率 77% (490/633)

続きです
読み返しますと
> が、とりあえずは上記内容でURL先の内容は取得できるのですが
> url = "http://www.~~~.com";
> という風にwwwをつけるとスクリプトがうごかずURL先の内容が取得できないのです。
ちょっと意味不明なのですが

require 'net/http'
require 'uri'
url = "http://www.nifty.com"
http=Net::HTTP.get_print URI.parse(url)
では、取得できます。
解決になっていないのかな??
補足コメント
1000vicki

お礼率 17% (40/226)

urlの変数内のURLのページの内容を取得したいのですが

たとえば私のブログはwww.があってもなくてもブラウザからは普通にアクセスできるのですが

その私のブログが対象だった場合、str = "http://~~~.com"
のURLで実行すると実際に内容をGETできているですが url="http://www.~~~.com"
としてしまうと、真っ白にというかまったく何もひょうじされなくなります。
例外もとっているのですが、例外処理も動いていないようです。
投稿日時:2011/09/15 07:01
  • 回答No.1

ベストアンサー率 77% (490/633)

Net::HTTP.get_print URI.parse(url)
が原因です

要するに内容をgetしているが、保存されてないのです。
http=Net::HTTP.get_print URI.parse(url)
な感じで
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ