• ベストアンサー

Perl/TkのWWW::MechanizeのGET失敗時の動作

WindowsにてPerl/Tkを使用しております。 WWW::MechanizeのGETを使って(おそらく)404 not foundを受信した後の動作の制御の仕方がわかりません。 下記ソースを実行して貰うとわかると思うのですが、 GETが失敗したら即sub関数内をreturnしてしまいます。 #!/usr/bin/perl use Tk; use Encode; use WWW::Mechanize; my $mech = new WWW::Mechanize(autocheck => 1); my $main = MainWindow->new; $main->Button(-text=>decode("cp932",'取得'),-font => ["MS ゴシック", 12], -command => \&get_source) ->grid(-row=>0,-column=>0); my $list = $main->Listbox(-selectmode=>'single',-font => ["MS ゴシック", 12]); $list->grid(-row=>1,-column=>0,-sticky=>'ew'); MainLoop; sub get_source{ my $uri = "http://www.google.co.jp/abcd"; $mech->get($uri); print "get_source end\n"; } 上記の「print "get_source end\n";」は実行されません。 データ取得先サイトがメンテナンス中は404になるようで困っています。 イメージでは「$mech->get($uri) or die "get_source error";」みたいな感じにエラーの場合の時の処理を記述したいのです。 ご存知の方いましたらご教示願います。 使用環境 ・Windows XP Professional SP3 ・Active Perl v5.8.6 for MSWin32-x86-multi-thread build811 ・自作PC(CPU:Athlon 64 3800+)

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

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

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

Mechanizeのgetは404とかだと例外を出すようですね。 #!/usr/bin/perl use warnings; use strict; use WWW::Mechanize; my $uri = shift || 'http://www.google.co.jp/abcd'; my $mech = new WWW::Mechanize( autocheck => 1 ); eval { $mech->get($uri); }; if ($@) { # 失敗 warn $mech->status, " : $@"; } my $res = $mech->response; print $res->content, "\n";

xkuonx
質問者

お礼

いつもお世話になってます。 上記で無事にできました! 例外が出されていたんですね。 失敗時を明示的にできるので気に入っています。 回答ありがとうございました。

その他の回答 (1)

回答No.2

my $mech = new WWW::Mechanize( autocheck => 1, onerror => undef ); として、 $mech->get($uri); print "get_source error\n" unless $mech->success(); または、 my $mech = new WWW::Mechanize( autocheck => 1, onerror => sub { die "get_source error"; } ); でどうでしょう。

参考URL:
http://digit.que.ne.jp/work/product/document/perldoc/WWW-Mechanize-1.02/Mechanize.html
xkuonx
質問者

お礼

なるほど…そういう手段があったのですね。 onerror=>でエラー時のサブルーチンに飛ばすと エラー対処箇所が多い場合には有効ですね。 今回はエラー時の対応が明示的になるので回答1を採用させて頂きます。 回答ありがとうございました。

関連するQ&A

  • Perl WWW::Mechanize

    恐れ入ります。WWW::Mechanizeを使って下記のサイトにアクセスしようとしても開くことが出来ません。業務上自動化したい部分があるのですが、画面が開かず、ロード中のままで開かない状態です。その他のサイトでは開くことが可能です。よろしくお願いいたします。 $url[0] = "https://salonboard.com/"; ← 開かない $url[1] = "https://www.google.com"; ← 開く my $mech = WWW::Mechanize->new( agent=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " ); my $response = $mech->get( $url[0] ); print "Content-type: text/html;\n\n"; print $mech->content;

    • ベストアンサー
    • Perl
  • WWW::Mechanizeについて教えてください

    WWW::Mechanizeついて 質問させて頂きます。 他でも質問しておりますが、回答が無かったためマルチですがご了承ください。 WWW::Mechanizeを使ってログインしようとしてるのですが、うまく行きません。 <form action="login.cgi" name="form1" method="post"> <input id=id name='id' type='text' /> <input id=pass name='pass' type='text' /> <input type="submit" name="submit" value="LOGIN" /> 上記のフォームでは正常に取得できます。 しかし、ログインチェックをJavascriptからPHPに渡ってるページでの ログインがうまく行きません。 ソース //入力チェック /*login_checkたとえです*/ function LOGIN(){ $( "userid" ).className = ""; $( "userpassword" ).className = ""; if( login_check( "id" ) ){ if( login_check( "pass" ) ){ document.form1.action = "login.php"; document.form1.Btn_Type.value = "login"; document.form1.submit(); }else{ $( "pass" ).className = "error"; } }else{ $( "id" ).className = "error"; } } <form action="login.php" name="form1" method="post"> <input id=id name='id' type='text' /> <input id=pass name='pass' type='text' /> <input type="button" name="loginbtn" value="LOGIN" onclick='JavaScript:LOGIN();'/> 上記のフォームにログインしようと下記のようにしました。 my $loginUrl = 'http://hoge.jp/login.php'; my $mech = WWW::Mechanize->new(cookie_jar => $cookie_jar); $mech->agent_alias('Windows IE 6'); $mech->get($loginUrl); $mech->form_name('form1'); $mech->field( id => "test" ); $mech->field( pass => "test" ); $mech->click_button( value => 'Login' ); print $mech->content(); これで実行するとエラーがでます。 Can't call method "header" on an undefined value at /usr/lib/perl5/site_perl/5.8.8/WWW/Mechanize.pm line 2471. $mech->click_button( value => 'Login' ); 上記のclick_buttonでvalueを指定するとエラーになります。 WWW::MechanizeはJavascriptは実行できないのでしょうか? お知恵をお貸しいただけませんでしょうか。 説明不足かもしれませんがお願い致します。

    • ベストアンサー
    • Perl
  • PerlのWWW**Mechanizeのオブジェクトから中身を取り出す

    PerlのWWW**Mechanizeのオブジェクトから中身を取り出す方法。 WWW:Mechanaizeでリンクの一覧を取得しようと思い 以下のようなコードを書きましたが、リンク一覧がWWW::Mechanize::Linkオブジェクトで取得されます。 解説文を読んでもここからどうやってテキストのアドレスを取得すればいいか分からないです。 何かメソッドを実行すればよいのでしょうか? わかりにくい質問かと思いますがご回答お願いします。 ……………………………………………………………………………… #WWW:Mechanizeの読み込み use WWW::Mechanize; #サイトの取得 $w = WWW::Mechanize->new(autocheck => 0); $w->get("URLが入ります。"); @link_list=$w->links; foreach ${_} (@link_list){print"${_}\n";}     ↓ WWW::Mechanize::Link=ARRAY(0x243c564) WWW::Mechanize::Link=ARRAY(0x243c564) とオブジェクトで返されてしまう。 ………………………………………………………………………………

    • ベストアンサー
    • Perl
  • WWW::Mechanizeがプロシキ経由になってしまう

    WWW::Mechanizeを使って診断君にアクセスすると判定結果が「判定:プロクシです proxy判定箇所が 1箇所、疑惑点が 2箇所ありました。」と出てしまうのですが #$mech->proxy('http', $proxy);の部分をコメントにしているのにどうしてでしょうか? 何方か教えてもらえませんか? ___________________ #!/usr/bin/perl use lib "lib"; use LWP::UserAgent; use WWW::Mechanize; $proxy = "http://xxxx.xxxx.jp:80"; $site = "http://www.taruo.net/e/"; my $mech = WWW::Mechanize->new(); #$mech->proxy('http', $proxy); $mech->add_header( Referer => 'http://www.yahoo.co.jp', Proxy-Connection => 'Keep-Alive', Connection => 'Keep-Alive', USER_AGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)', ACCEPT => 'image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,image/pnp,*/*', ACCEPT-CHARSET => 'iso-8859-1,*,utf-8', ACCEPT_LANGUAGE => 'ja', ACCEPT_ENCODING => 'gzip,deflate', Content-Type => 'application/x-www-form-urlencoded', Content-Length => '100', HOST => 'www.taruo.net', HTTP_CONNECTION => 'Keep-Alive', ); $mech->post("$site"); $html = $mech->content; print "Content-type: text/html;\n\n"; print<<endend; $html endend exit;

    • ベストアンサー
    • Perl
  • WWW::Mechanizeの文字コードについて質問

    WWW::Mechanizeの文字コードについて質問 以下のようなソースコードを書いて実行してみたのですが どのサイトを取得しても、すべて文字コードがUTF8だと認識されます。 ------------------------------------------------------- #!/usr/bin/perl #WWW:MechanizeでHTMLの取得 use WWW::Mechanize; $w = WWW::Mechanize->new(); $w->get("URL"); $html=$w->content; #文字コードの判別 use Encode; use Encode::Guess qw/ascii utf8 euc-jp shiftjis 7bit-jis/; my $dec = Encode::Guess->guess($html); print$dec->name; ------------------------------------------------------- 例えば以下のサイトは文字コードがEUC-JPですがこれもprintされるのはUTF8となってしまいます。 http://barukanlog.blog31.fc2.com/blog-entry-541.html WWW:Mechanizeでサイトを取得し、サイトの文字コードを調べてすべてsjisにする ということがしたいのですが、すべてutf8に判断されて先へ進めないんです。 何か設定やメソッドを追加しなくてはいけないのでしょうか? わかりにくい質問かとは思いますがご回答お願いします。

  • Perl/TkでURLを既定のブラウザで開く方法

    Perl/TkでGUIプログラミングをしております。 プログラム中のButtonを押した時に自分のパソコンに設定している 既定のブラウザでWEBサイトを開くにはどうすればいいでしょうか? イメージは下記のような感じです。 use Tk; use Encode; $url = "http://okwave.jp/"; $main->Button(-text=>decode("cp932","URLを開く"),-font => ["MS ゴシック", 12], -command => \&open_url) ->grid(-row=>0,-column=>0); sub open_url{ # 既定のブラウザでURL($url)を開く処理 } よろしくお願いします。

    • ベストアンサー
    • Perl
  • WWW::Mechanizeでfc2にログインする方法

    WWW::Mechanizeでfc2にログインする方法 WWW::Mechanizeでfc2ブログ管理画面にログインしようとしたところ、上手くできませんでした。 $mech = WWW::Mechanize->new(autocheck => 1); $mech->get('http://fc2.com/login.php?ref=blog'); ・・・※1 $mech->submit_form(                ・・・※2 fields => { email=> [ユーザID], pass => [パスワード], }, ); $mech->title()や$mech->content()で確認したところ、※1のページ(ログイン画面)までは取得できているようです。 しかし※2のログイン情報の送信後に、同じように確認したところ、ログイン後に表示されるはずの管理画面へ遷移していませんでした。 [ユーザID],[パスワード]の設定値は正しいことを確認しています。 フィールド名(email,pass)はmech-dumpコマンドで確認しました。 $mech->success()は1を返しています。 どうすればログインできるようになりますか? 間違いや他に確認すべき項目をご教示いただけたら幸いです。 実行環境:ubuntu

    • ベストアンサー
    • Perl
  • ActivePerlのWWW::Mechanize::Firefoxに

    ActivePerlのWWW::Mechanize::Firefoxについて教えてください。 http://maaash.jp/perl/wwwmechanizefirefox%E3%81%A7%E7%B0%A1%E5%8D%98%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/ 上記のURIを参考にHPの自動テストとスクリーンショットを行うプログラムを作ろうとしています。 当方はPerl及びLinuxsは素人です。 まず、Windows XP sp3に ActivePerl v5.10.1をインストールして 上記サイトに記述されているソースをもとにソースファイルを作り実行したところ 「Can't locate WWW/Mechanize/Firefox.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) line 3」 とエラーが表示されたので。 http://search.cpan.org/~corion/WWW-Mechanize-Firefox-0.31/ ↑よりファイルをダンロードして「Perl Package Manager」でインストールしたところ 「WARNING: Installing WWW-Mechanize-FireFox-0.11 would downgrade HTML::Display::MozRepl from version 0.31 to 0.11」と表示されます。 そこから色々と調べながらやっているのですが先に進めません。 Googleで調べてみると「WWW::Mechanize」ってすげー簡単とか賞賛する書込みが多いためすごい ショックでくじけまくってます。 先に進むためのヒントだけでもお願いできないでしょうか?

  • WWW::Mechanizeを使っておられる方、又は使える方に質問です。

    WWW::Mechanizeを使っている方、使える方にお聞きしたいです。 下記のような適当なURLを読みこんでそのリンクを辿るコードを書きました。 リンクが見つからなかった場合のチェックが正常に働くかの確認ため、 15行目でわざと存在しないlinkを指定してみました。 16行目で止まって欲しいのですが、止まりません。最終行の様にすると止まります。 この振舞いは私だけでしょうか? もしお手持ちの環境でMechanizeが使える方、試せる方がおられましたら 結果を教えて頂けたら幸です。 1つ気になっているのは、installのmeke testの段階で、 以下に関しエラーが出てはおりました。 t/live/follow.t t/live/follow_link.t t/live/get.t t/local/back.t 私の環境は RHL9, perl, v5.8.0 gcc 3.2.2 です。 #!/usr/bin/perl -w use strict; use WWW::Mechanize; use LWP 5.803; my $url="http://www.yahoo.co.jp"; my $mec=WWW::Mechanize->new(); my $response=$mec->get($url); $mec->success() or die $mec->res->status_line(); # $urlが存在しない場合はここで止まって欲しいし実際とまることを確認。 my $a=$mec->follow_link(url_regex => qr/bad_html$/); #存在しないリンクを指定 $mec->success() or die $mec->res->status_line(); #ここで止まることを期待するが止まらない。 #$a or die "Failed to find links\n"; #こうすれば止まる。

    • ベストアンサー
    • Perl
  • perl/tkで日本語を表記したいのですがうまくいきません。

    perl/tkについての質問です。 ラベルウィジェットに日本語を表記したいのですが、ご存知の方教えて下さい。 -text=>"ファイル名" のファイル名が文字化けしてしまいます。 ------------------------------------------- #!c:\perl\bin\perl.exe use Tk; $top = MainWindow->new(); $top->title("test"); $font=['MS ゴシック', 11, 'normal']; #ファイル名 $lb_f=$top->Label(-font=>$font, -text=>"ファイル名")->grid(); MainLoop(); -----------------------------------------------------------