LWPでHTMLが取得できない場合の理由とは?

このQ&Aのポイント
  • LWPを使用してHTMLを取得すると、取得可能なサイトと不可能なサイトがあります。
  • yahooのトップページは取得可能ですが、wikipediaは取得できません。
  • 取得できない場合、エラーメッセージが表示されない理由を教えてください。
回答を見る
  • ベストアンサー

LWPでHTMLが取得できないことがある

LWPを使ってHTMLを取得しようとしているのですが、取得可能のサイト、不可能のサイトがあります。 たとえばyahooのトップページは取得できますが、wikipediaは取得できません。取得できない場合、エラーメッセージは出ません。 このようになる理由を教えてください。 よろしくお願いいたします。 環境:windowsXP & ActivePerl、またはwindowsXP & cygwin コード: #wikipediaのトップページHTMLを取得する use LWP::Simple; $site = get "http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8"; print $site; #yahooのトップページHTMLを取得する use LWP::Simple; $site = get "http://www.yahoo.co.jp/"; print $site;

  • Perl
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

wikipedia では、LWP::Simple のアクセスを許可していないのだと思います。 get() の代わりに getprint() を使用すると、次のエラーメッセージが出ます。 $ perl -MLWP::Simple -e "getprint 'http://ja.wikipedia.ogr/';" 403 Forbidden <URL:http://ja.wikipedia.org/> 下記の URL でほぼ同じ問題を取り上げていますのでご覧ください。

参考URL:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35645&forum=10&3
takoyaki_b
質問者

お礼

回答ありがとうございます。 参考URLで解決しました。

その他の回答 (2)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3
takoyaki_b
質問者

お礼

回答ありがとうございます。

noname#208124
noname#208124
回答No.1

ユーザーエージェントで弾いてるんじゃないですか Googleとかもlibwww-perlの方弾いてます LWP::Simpleのリクエストヘッダはこれで403 Forbiddenとエラーページ返ってきてます GET http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 HTTP/1.1 TE: deflate,gzip;q=0.3 Connection: TE, close Host: ja.wikipedia.org User-Agent: LWP::Simple/5.814 LWPを使った場合はこれで200 OKでちゃんとコンテンツ返ってきてます GET http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 HTTP/1.1 TE: deflate,gzip;q=0.3 Connection: TE, close Host: ja.wikipedia.org User-Agent: libwww-perl/5.814

takoyaki_b
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • LWP::simpleがiswebで使えない

    use LWP::Simple; print (get("http://www.yahoo.co.jp/")); このように使っていたのですが、iswebにアップロードしたところ、ダウンロード出来ずに使えなくなりました。 iswebでは使えないようです。 なので、これの代わりになる方法を探しているのですが、何かありますか? Webページのソースを取得するだけでいいです。 なにかあるでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • LWPによるページ取得の問題

    すいません、アホです。いろいろ調べましたが、まったくみつかりませんでした。この質問をすることは初歩すぎて失礼かとおもいますが、堪忍してくださいませ。 LWPで相互リンクをされているかどうかをCGIファイルの登録ページ後に判断したいプログラムですが、同じCGIファイル内に登録ページがありまして、<INPUT size=30 name=url>のように相手リンクを登録した自分のHTMLを書いてsubmitさせて、 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } で、取り出し、$FORM{'url'}まできます。URLがちゃんと$FORM{'url'}に入っているのは画面で確認できるのですが、下記のように指定した場合、相手HTMLを取得できません。エラーメッセージはでないで、真っ白い画面がでます。 $url = $FORM{'url'}; use LWP::Simple; $content = get("$url"); print "Content-type: text/html\n\n$content"; 下記はちゃんとうつります。 $url = 'http://www.yahoo.co.jp'; use LWP::Simple; $content = get("$url"); print "Content-type: text/html\n\n$content"; これは$FORM{'url'}のエンコードの問題なのでしょうか? まことに申し訳ありませんが、その方法をできれば具体的にお教えくださいませ。 何卒、宜しく御願いいたします。m_ _ m

  • LWPモジュールについて教えてください。

    プログラミングは初心者です。 LWPモジュールのサブクラスLWP::Simpleの get()という関数を使いたいです。 現在、Perlは5.005_3を使用しています。 use LWP::Simple; require LWP::Simple; ・ get(URL) と入れると、500 Internal Server Errorと言うものが出てしまいます。 LWPを使うとき、どのようにすれば使えるのかご指導お願いいたします。

    • ベストアンサー
    • Perl
  • LWPでHTML取得(その前にSocket取得)できない

    初めて投稿させていただきます。 宜しくお願い致します。 LWP::Simpleなどを使ってWebサイトのHTMLソースを 取得したいのですが、できません。 同じplファイルを使って環境Aでは取得できているのですが、 環境Bでは出来ません。 LWPのバージョンは5.805で、両環境とも同じです。 どこでエラー?が起こっているかSimple.pmから ソースを追って見たところ、 LWP::Simple::_trivial_http_get( )のSocketを取得する所で undefが返却されているようです。 さらに追っていくと、 IO::Socket::INET::new( ) →IO::Socket::new( ) →IO::Socket::INET::configure( ) 最終的にここまで来ました。 configure( )の、 --------------------------------------------- if ($sock->connect(pack_sockaddr_in($rport, $raddr))) { # ${*$sock}{'io_socket_timeout'} = $timeout; return $sock; } --------------------------------------------- ここまで来て、上記のifブロックに入らず、timeoutかよくわかりませんが、 とにかくソケットを返していないようなのです。 その原因を、お教え頂きたいのです。 環境AとBで違う所は、大きな差としては、 無線LANを使ってない(A)か、使ってるか(B)しか無いです…。 また、環境Bで試した点としては、 ・無線LANルータに対して get('http://192.168.xx.yy');のようにした事と →結果、だめ ・apache tomcatが立ち上がっているローカルホストに get('http://192.168.xx.zz:8080');のようにした事 →結果、だめ です。 長々と状況説明してすみませんが、ご回答お待ちしております。 以上です。

    • ベストアンサー
    • Perl
  • 続:LWPでHTML取得(その前にSocket取得)できない

    以前このカテゴリで質問させて頂いたものです。 (質問No.2007952、質問:LWPでHTML取得(その前にSocket取得)できない)  ※twinkleluzさんには大変お世話になりました。 上記質問では解決しきれなかった問題として、 ウィルスセキュリティのファイアウォールの設定が出来ない事、 があります。 Perlで、LWP::Simple::get()を使用し 一般サイトのHTMLソースを インターネット経由で取得出来るようにするには どのような設定を行えばよいか、 perl、ウィルスセキュリティについて詳しい方の 説明を宜しくお願い致します。 なお、使う関数ではなくperlの実行ファイルを ファイアウォールに登録というのは既に行っております。 ※ウィルス対策カテゴリでも同じ質問をさせて頂きましたが 回答を頂けませんでしたのでこちらでも質問させて頂きます。

  • use LWP::Simple get で、https:// は取得できない?

    use LWP::Simple と get を使って、英訳ページなどを作るという記事を見ました。 私も似たような翻訳もどきを作って楽しんでいるのですが、 http:// は取得できても、https:// は取得できない みたいなのです。 https:// は、いったいなんなのでしょうか? これうまく取り込む方法はないでしょうか。

    • ベストアンサー
    • Perl
  • Perl LWPでproxyがうまく刺さらない

    Perl初心者です。 LWPでどうしてもproxyが通りません・・・。 何が悪いのかわかりません。教えてください。 モジュールは全て導入を確認しました。 よろしくお願いします。 稚拙なミスだったらごめんなさい。 use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new( timeout=>"5" ); #cybersyndromeさんからLWP::Simpleでproxyを取得 $_ = get('http://www.cybersyndrome.net/pla5.html'); #proxyをリストに代入 (@proxy_list)=/\"\>(.*?)\<\/a\>\<\/li\>\<li\>/g; #適当なサイトをリクエストのターゲットに $r = new HTTP::Request GET,('http://taruo.net/e/'); #前述のターゲットへリクエストしてひとつづつproxyが通るか確かめたいのに何故かすべてすぐにERRORに for($i = 0;$i <= 10;$i++){ $proxy = 'http://'.$proxy_list[$i]; $ua->proxy ([qw(http https)] , $proxy); $req = $ua->request($r); if ($req->is_success) { print "Success!\n"; }else{ print "Error\n"; } }

    • ベストアンサー
    • Perl
  • LWP Cookie取得

    恐れ入ります。 LWPで、特定サイトにアクセスした時に発行されるCookieを任意のディレクトリに保存したいのですが、どのようにしたらよいかわかりません。 use HTTP::Cookies; use LWP::UserAgent; $ua = LWP::UserAgent->new(); $cookie_file = './cookie/xxx.txt'; $cookie_jar = HTTP::Cookies->new(file => $cookie_file, autosave => 1); $url = "http://~~"; $response = $ua->get($url); print $response->content; で、コンテンツは表示されますが、xxx.txtにcookieが保存されません。 #LWP-Cookies-1.0 のみが記載された白紙のxxx.txtが精製されます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • LWP::Simpleでのgetについて

    つい先日ローカルにサーバ環境をインストールし、 色々とプログラムを試しているのですが、 タイトルに記述したLWP::Simpleのgetを使用すると500エラーとなってしまいます 実行内容は下記のような単純なものです use LWP::Simple; $url = "http://localhost/test.cgi";#自動リンク防止に「:」を全角にしてます $html = get($url); print "Content-Type: text/html\n\n"; print $html; ・test.cgi単体では動作しています(単純に文字を出力するのみ) ・$url をローカルでなく外部URL(例 yahoo等)にしてもエラーとなりました ・getを行わなず $html = "a";のように任意文字列にした場合は出力されます ・perl/lib/LWP/ には Simple.pm が入っています ・use 行をevalで囲み $@ を見てみましたがエラーは入っていませんでした ・セキュリティソフトがブロックしている可能性も考え、切ってみましたが駄目でした ・レンタルサーバー上で実行した場合は成功しました($urlを外部URLにて) こちらはApacheやOS側で他に何か設定等が必要なのでしょうか それとも不足しているものがあるのか・・・手詰まり状態です 些細なことで結構ですので、助言いただけると助かります 以上、よろしくお願いします ----------------------------------- Apache/2.2.4 Perl/v5.8.8 WinXP/HE サーバ環境はXAMPP及びXAMPP Add-Onsで一括インストール

  • [LWP?] 特定のCLASSの値だけ取得したい

    LWPを使って、特定のWebページを取得しました。 -- use LWP::UserAgent; $ua = LWP::UserAgent->new; $ua->agent("$0/0.1 " . $ua->agent); $req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/'); $req->header('Accept' => 'text/html'); # リクエストの送信 $res = $ua->request($req); # 出力のチェック if ($res->is_success) { print $res->content; #←ここが取得したあいたいです。 } else { print "Error: " . $res->status_line . "\n"; } -- この中から指定したclassのinnerTextだけ取得したいのですがどのようにしたらよいのでしょうか? 要は$res->contentに -- <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> </BODY> -- のような値が入っていてclass=bbbの「yyy1」~「yyy3」だけ取得したいのですが。 よろしくお願い致します。 (参考)LWP http://homepage3.nifty.com/hippo2000/perltips/LWP.html

    • ベストアンサー
    • Perl

専門家に質問してみよう