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のコンテンツ内容を取得すること自体
出来ないのでしょうか?
その場合代案等もありましたら、教えてください。
とても困っています。
よろしくお願いいたします。
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 …
再びご回答ありがとうございます。
プロキシの設定は私のプログラムでもちゃんと出来ていて、$res->codeは私の方でも”200”が返ってきています。
かなり、何度もご質問をして申し訳ないですが、
最後に1つだけ教えて下さい。
HTTPSサイトに接続して$res->contentで、ソースの内容は取得できますか?
私のところでは「<HTML></HTML>」のみしか返ってこなくて、困っています。
もう4日近く悩んでいまして、どうしてもだめなら
やったことないですが、VBScriptで頑張るしかないかなと考えています。
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>© 2005 Chamas Ente
rprises Inc.</b></font> </td></tr></table></BODY></HTML>
===========
Status: 200
C:\>
guci-okさん。本当にありがとうございました!!
本当にすいません。やはりプロキシの設定のやり方が
悪かったようでした。
ステータスが200で返ってきていたので、
プロキシは問題ないと思い込んでいました。
1週間近く悩んだ問題がやっと解決して、
すっきりしました。
本当に助かりました。
また機会があれば、よろしくお願いいたします。
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");
...
を書きました。
状況がよく分からないのですが参考になれば...
この回答への補足
確かに、私の方でリクエストしている内容に不備があり再度リフレッシュでアクセスさせているのかと思い考えましたが、やはりわからず困っています。
ソースを下記に書きますので、これを参考に
もう少しアドバイスをお願いします。
#プロキシサーバー
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";
}
No.1
- 回答日時:
実際にhttpsからLWPってやってみたことはないのですが、
Crypt::SSLeay
をインストールするとLWPは自動でhttpsを使うということらしいので、別の問題なのではないかと思います。
例えば、IEでは、そのコンテンツが取得できるということであれば、
my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application');
でIEに取らせるということもできるかもしれません。
さっそく、回答ありがとうございます。
Win32::OLEも調べてみましたが、
IEを操作というのは
私がやりたい意図とはちょっと違っていましたので
あきらめました。
他に案ややり方をご存知の方どうかよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- その他(行政) e-govで必要な電子証明書について 1 2022/08/20 22:56
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[C#]ListView一覧表示時の幅設...
-
VBAでExcelのヘッダーに文字列+...
-
perlでHTTP Request Headersの...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
apacheでPerl CGIが作動せず、5...
-
燃えるゴミの日は何曜日ですか?
-
週休3日制で土日の他にもう一日...
-
CGIの中で出力するテキスト内容...
-
エクセルで相対パスの書き方を...
-
エクセルで毎月第2週日の水曜日...
-
カレンダープログラム、曜日の...
-
入力した日は何曜日か
-
for a week tomorrowはどういう...
-
VBA。複数のChangeイベントをま...
-
週2回のペースって だいたい何...
-
apacheで403を404のように見せる
-
[Excel] ある日の曜日が当月の"...
-
CGIで出力するhtmlの<!DOCTYPE ...
-
require文が実行できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでExcelのヘッダーに文字列+...
-
ヘッダのinclude順
-
[C#]ListView一覧表示時の幅設...
-
AccessVBAで「このフィールドに...
-
perl5について
-
LinuxでRTPヘッダを作りたいの...
-
ルータでのMTU、MSS設定値の検...
-
Content-type: text/htmlが表示...
-
リストコントロールの列幅を固...
-
EXCEL:ヘッダー日付を年号で?...
-
perlでHTTP Request Headersの...
-
HTTPヘッダの大きさ
-
ftpでのネットワークバイトオー...
-
SpreadDesignerの列ヘッダ
-
cookieを表示させたい。(ブラウ...
-
http://から始まるファイルの更...
-
LWPでのCookie取得
-
file_get_contents でリダイレ...
-
関数ヘッダ?
-
HTTP 200 OKの後のリダイレクト?
おすすめ情報