• ベストアンサー

LWPでHTTPSサイトからコンテンツ取得

LWP::UserAgentを使用してHTTPSサイトから、 コンテンツを取得して解析処理をしたいのですが、 取得できなくて困っています。 Crypt::SSLeayやopensslを入れてアクセスは出来るようになったのですが、 HTTPサイトの場合 $ua = LWP::UserAgent->new; my $Req = HTTP::Request->new('GET', 'http://~'); my $Res = $ua->request($Req); my $content = $Res->content; これで、コンテンツのソースを取得できたのですが、 同じ用にhttpsサイトから取得しようしても 「<HTML></HTML>」だけしか取得できませんでした。 ちなみに my $content = $Res->as_string; としてみると、 HTTP/1.0 200 OK Content-Type: text/html Client-Date: Thu, 08 Dec 2005 08:01:10 GMT Client-Peer: *.*.*.*:8080 ←隠させてもらいます Client-Response-Num: 1 Refresh: 0; URL=https://~ という取得したいHTTPSサイトにジャンプするような 内容が取得できました。 どうにかしてコンテンツ内容を取得したいのですが、 そもそもHTTPSのコンテンツ内容を取得すること自体 出来ないのでしょうか? その場合代案等もありましたら、教えてください。 とても困っています。 よろしくお願いいたします。

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

  • ベストアンサー
  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.5

プロキシサーバー使っているんですか? 参考URLにあるように、Crypt::SSLeayの場合、 設定の仕方が少し違います。 # PROXY SUPPORT $ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port'; # PROXY_BASIC_AUTH $ENV{HTTPS_PROXY_USERNAME} = 'username'; $ENV{HTTPS_PROXY_PASSWORD} = 'password'; 私の会社でもプロキシサーバー入っていますが、 そのプロキシを通してSSLのサイトにアクセスできています。ただし、プロキシは8000です。 8080の場合の影響は分かりません。って、プロキシが8080ってあるんですか。 で、一度プロキシの無い、直にインターネットにつながった環境で、ご自分のスクリプトがちゃんとSSLにアクセスできているかは本当に確認されてますか? S1.plは、参考URLのそのままです。最初エラーになったけど、2回目OKでした。 S1.pl #!Perl use LWP::UserAgent; my $ua = new LWP::UserAgent; my $req = new HTTP::Request('GET', 'https://www.nodeworks.com'); my $res = $ua->request($req); print $res->code."\n"; __END__ D:\@ai\@Perl\refresh_redirect>S1.pl 500 D:\@ai\@Perl\refresh_redirect>S1.pl 200 D:\@ai\@Perl\refresh_redirect>

参考URL:
http://search.cpan.org/~chamas/Crypt-SSLeay-0.51/SSLeay.pm
club_m2005
質問者

お礼

再びご回答ありがとうございます。 プロキシの設定は私のプログラムでもちゃんと出来ていて、$res->codeは私の方でも”200”が返ってきています。 かなり、何度もご質問をして申し訳ないですが、 最後に1つだけ教えて下さい。 HTTPSサイトに接続して$res->contentで、ソースの内容は取得できますか? 私のところでは「<HTML></HTML>」のみしか返ってこなくて、困っています。 もう4日近く悩んでいまして、どうしてもだめなら やったことないですが、VBScriptで頑張るしかないかなと考えています。

その他の回答 (5)

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.6

この15行のスクリプトをそのまま実行してみて下さい。 但し、5~7行目はご自分の環境に合わせて下さい。 URLを何処にしようかと迷ったのですが、これはCrypt::SSLeayの ドキュメントにでてくるので、最適でしょう。 これができないなら、Crypt::SSLeayのインストールがおかしいか、 貴方のプロキシまたはネットワークに問題があると思います。 #!Perl # LWP_SAMP_SSL.pl: LWP sample acess to https use LWP::UserAgent; print "start to access: 'https://www.nodeworks.com'\n"; $ENV{HTTPS_PROXY} = '10.1.2.3:8080'; # For Crypt::SSLeay $ENV{HTTPS_PROXY_USERNAME} = 'user'; $ENV{HTTPS_PROXY_PASSWORD} = 'pass'; my $ua = new LWP::UserAgent; my $req = new HTTP::Request('GET', 'https://www.nodeworks.com'); my $res = $ua->request($req); my $content = $res->content; my $code = $res->code; $content =~ s/[\r\n]//g; print "=========\n content:\n $content \n===========\nStatus: $code\n"; __END__ C:\>LWP_SAMP_SSL.pl start to access: 'https://www.nodeworks.com' ========= content: <html><head><meta HTTP-EQUIV="Content-Type" content="text/html; charset=iso-885 9-1"><meta name="keywords" content="link checker, link checking, link check, dea d links, broken links, link qa, web qa, link verify, link verification"><meta na (長いので途中省略) ew,courier;font-size:12px"><input tabindex=1008 type="submit" name="submit" valu e="Account Login"></font> </td> </tr></td></tr> </form></table> <tr><td colspan=2><center><hr size=1 width='90%' noshade></center></td></tr></table><fon t style="font-family:verdana,helvetica;font-size:12px">Please fill out the <a hr ef="remind.asp?session-id=026945e4c20a702e78e19f85b8cf10c9">password request for m</a>,if you cannot remember your password.</font> </font> </td></tr></table > </td></tr></table></td></tr> <tr><td align=center> <br> <font style="font-family:verdana,helvetica;font-size:10px" ><b>&copy; 2005 Chamas Ente rprises Inc.</b></font> </td></tr></table></BODY></HTML> =========== Status: 200 C:\>

club_m2005
質問者

お礼

guci-okさん。本当にありがとうございました!! 本当にすいません。やはりプロキシの設定のやり方が 悪かったようでした。 ステータスが200で返ってきていたので、 プロキシは問題ないと思い込んでいました。 1週間近く悩んだ問題がやっと解決して、 すっきりしました。 本当に助かりました。 また機会があれば、よろしくお願いいたします。

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.4

> そもそもHTTPSのコンテンツ内容を取得すること自体 > 出来ないのでしょうか? Crypt::SSLeayで普通に処理できます。 サーバーが、"304 moved"のような応答を返した場合、LWPは自動でジャンプ するのですが、応答ヘッダのrefreshには対応していないようです。 (これは私が実際に試したところの話です) ならば、refreshに答えてジャンプすれば良いのではないでしょうか? リクエストの後で、 my $refresh_header = $res->header("Refresh"); if ($refresh_header =~ m|url\=(.+)$|i) { print "\nMust refresh to: '$1'\n"; ... } else { print "\nNo refresh found...\n"; } しかし、質問の内容は、 URL、https://~にアクセスしたら、その応答ヘッダで、 Refresh: 0; URL=https://~ と最初のアクセスと同じURLを返してきた、のように見えます。 これだと、Refreshをたどってジャンプしてもどうどう巡りになって しまいそうです。 本当にそのような状況なのでしょうか? 何かの条件を判断して再アクセスさせようとしているようにも見えますが、 単に同じURLを再アクセスさせとうとするサーバーの意図が分かりません。 以下は、LWPが自動でリダイレクト先にジャンプする応答を返すCGIです。 #!Perl use CGI qw/:all/; print redirect("https://.....co.jp/"); __END__ 以下は、LWPが自動でリダイレクトしない応答を返すCGIです。 #!Perl use CGI qw/:all/; print header({ -refresh => "0;url=https:////.....co.jp//"} ); __END__ 私はこの2つのCGIを使って最初のコード、 my $refresh_header = $res->header("Refresh"); ... を書きました。 状況がよく分からないのですが参考になれば...

club_m2005
質問者

補足

確かに、私の方でリクエストしている内容に不備があり再度リフレッシュでアクセスさせているのかと思い考えましたが、やはりわからず困っています。 ソースを下記に書きますので、これを参考に もう少しアドバイスをお願いします。 #プロキシサーバー use constant PROXY => 'http://proxy:8080/'; #URL use constant URL =>'https://~'; my $Ua = LWP::UserAgent->new(); $Ua->agent("Schmozilla/v9.14 Platinum"); $Ua->proxy(['https', 'http', 'ftp'], PROXY); $Ua->cookie_jar(); my $Req = HTTP::Request->new('GET', URL); my $Res = $Ua->request($Req); print "content-type:text/html\n\n"; if( $Res->is_success() ) { print $Res->content; } else { print "Error"; }

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

サイト側で、クッキーやリファラ、エージェント情報をみて、コンテンツを返してるかも。 LWP::UserAgent->cookie_jar()をセットアップした上で、ステップを分でサイトにアクセスしてみては。

club_m2005
質問者

補足

LWP::UserAgent->cookie_jar()を追加してみましたが、 だめでした。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>Refresh: 0; URL=https://~ からリダイレクト先のアドレスを抽出して再度取得を試みるとかはやってみました?

club_m2005
質問者

補足

リダイレクト先のURLは最初にRequestで指定したアドレスとまったく同じでした。 なので、再度やっても同じです。 ん~やっぱり、HTTPSのサイトは取得じゃなくジャンプしないといけないのかもしれませんね。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

実際にhttpsからLWPってやってみたことはないのですが、 Crypt::SSLeay をインストールするとLWPは自動でhttpsを使うということらしいので、別の問題なのではないかと思います。 例えば、IEでは、そのコンテンツが取得できるということであれば、 my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application'); でIEに取らせるということもできるかもしれません。

club_m2005
質問者

お礼

さっそく、回答ありがとうございます。 Win32::OLEも調べてみましたが、 IEを操作というのは 私がやりたい意図とはちょっと違っていましたので あきらめました。 他に案ややり方をご存知の方どうかよろしくお願いいたします。

関連するQ&A