• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perl WWW::Mechanize)

Perl WWW::Mechanizeを使って特定のサイトにアクセスできない

asciizの回答

  • asciiz
  • ベストアンサー率70% (6672/9459)
回答No.1

解決に至ってはいないのですが試したことなど。 まず $mech->timeout(3); を入れておいてアクセスすると、3秒でタイムアウトエラーが表示されます。 デフォルト180秒なんで、3分待っても同じエラーが出たでしょうけども、まあテストには短い方がいいので…。 で、SSLの対応レベルかとも思って、SSLeay 内蔵のOpenSSLバージョンを表示してみたところ、私のところでは以下の通り。 >C:\>perl -MNet::SSLeay -e "warn Net::SSLeay::SSLeay_version(0)" >OpenSSL 1.0.1g 7 Apr 2014 at -e line 1. OpenSSL 1.0.1 はTLS 1.2 までの対応。 でも salonboard.com 自体は、TLS 1.1 や TLS 1.2 でも接続できたので、そこも問題ないようです。 MechanizeはJavaScript非対応なのでそこか? …と通常ブラウザでスクリプト禁止にしてアクセスしてみましたが、それも問題なく画面は表示されます。 OpenSSL をインストールして手動アクセスしてみたところ、これも問題なし。 C:\> openssl s_client -connect salonboard.com:443 ←入力 CONNECTED(00000158) (中略) GET / HTTP/1.1 ←入力 host: salonboard.com ←入力 ←空Enter入力 HTTP/1.1 200 OK Server: Apache X-Frame-Options: SAMEORIGIN Last-Modified: Wed, 18 Sep 2019 05:59:46 GMT (以下HTMLヘッダとHTML本文) ではどうして WWW::Mechanize のアクセスでタイムアウトになってしまうのか…。 ここではたと気づいたのが、ユーザーエージェント文字列。 >http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi こちらで、サーバーが受け取っている文字列を確認してみました。 すると、プログラムでは >my $mech = WWW::Mechanize->new( agent=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " ); となっていますが、そのサイトで表示されたのは以下の通り。 >HTTP_USER_AGENT | Mozilla/5.0 (Windows NT 10.0; Win64; x64) libwww-perl/6.05 あー、これは!! もう一度手動アクセス実験します。 C:\> openssl s_client -connect salonboard.com:443 ←入力 CONNECTED(00000158) (中略) GET / HTTP/1.1 ←入力 host: salonboard.com ←入力 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) libwww-perl/6.05 ←入力 ←空Enter入力 …反応がありません。 どうやらこのサイトは、ロボット対策として、ユーザーエージェント文字列に「libwww-perl」が含まれると、反応を返さなくなるように仕組まれているのではないかと…? (すぐに接続を切ったりエラーを返すと1秒に何百回もアクセスされたりするので、接続したうえで反応を返さない。) Mechanize の親である LWP(library: www perl) においては、必ずこのUA文字列が付加されてしまうようです。 LWPに頼らずに、自分でhttps通信してWebページ取得すればあるいは…。 サンプル >Net::SSLeay - OpenSSLやSSLeayを使うためのPerl拡張 - perldoc.jp >https://perldoc.jp/docs/modules/Net-SSLeay-1.20/SSLeay.pod ※Mechanize でhttps接続できているならば、既にNet::SSLeay は入っています

spider32
質問者

お礼

ご丁寧な返信大変恐縮です。当方でUser Agentをセットして、http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi へMechanizeでアクセスを行った場合、User AgentはMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11と表示されご指摘いただいた文字列が含まれていませんでした。何か他にヘッダー情報で問題が在るのかどうかが分からないのですが、とにかく挙動をみていると全く受け付けていないように見えるのはご指摘の通りかと思います。

spider32
質問者

補足

ご丁寧な返信大変恐縮です。当方でUser Agentをセットして、http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi へMechanizeでアクセスを行った場合、User AgentはMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11と表示されご指摘いただいた文字列が含まれていませんでした。何か他にヘッダー情報で問題が在るのかどうかが分からないのですが、とにかく挙動をみていると全く受け付けていないように見えるのはご指摘の通りかと思います。

関連するQ&A

  • 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ついて 質問させて頂きます。 他でも質問しておりますが、回答が無かったためマルチですがご了承ください。 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で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
  • 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の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
  • 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
  • Parallel::ForkManager(2)

    前回の投稿で完全に書き間違えた部分がありそのままではよくわからないものになってしまっていたのですが、投稿し直しなどができなかったので再度投稿させてもらいます。 プログラムは use Web::Scraper; use WWW::Mechanize::Firefox; use Parallel::ForkManager; use URI; binmode STDOUT,":utf8"; sub func ; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $year += 1900 ; $mon += 1 ; $File = "yuma-$year:$mon:$mday:$hour.txt" ; open (file,"> $File") or die 'fail to open file\n'; print "HOW MUCH PAGE\n" ; my $page = <STDIN> ; print "WITEING...\n" ; my $MAX_PROCESSES = 5; my $pm = new Parallel::ForkManager($MAX_PROCESSES); for ($i = 1;$i <= $page;$i++) { $pm->start and next; my $uri = URI -> new ("www.目的とするURL$i.html"); my $mech = WWW::Mechanize::Firefox->new(); $mech->get($uri) ; print file $s->scrape($mech->content) ; print file "\n" ; print file $r->scrape($mech->content) ; print file "\n" ; $pm->finish; } print "WITEID\n" ; my $s = scraper { process 'font',sen => 'TEXT'; result 'sen'; }; my $r = scraper { process 'div#content',ren => 'TEXT'; result 'ren'; }; close (file) ; です。 $i の順序でファイルへ書き込みをしていきたいのですが、前の処理が終わっていなかった場合に待つ方法がわからないので初心者レベルで教えてください。

    • ベストアンサー
    • Perl
  • mechanizeのタイムアウト処理について

    いつもお世話になります。 perl+mechanizeで、スクレイピングスクリプトを書いております。 $mech->reload(); にて、44秒~2分程度、サーバーから反応がない場合があります。この場合$mech->contentからは、"500 Server closed connection without sending any data back"というエラーを得ることができます。 この$mech->reload()時に、例えば、5秒待って、サーバーから反応がない場合は、次の処理に進ませる実装方法はありますでしょうか? $mechの生成時に、 $mech = WWW::Mechanize->new(timeout => 5); などとして、タイムアウト時間を5秒に設定することも出来るようですが、前記$mech->reload()時の時のみ5秒間のタイムアウト時間としたいのです。というのも、その他の箇所で、$mechは時間をかけてもよいからです。 以上、すみませんが、ご存知の方がいらっしゃいましたら、ご教示願います。

    • ベストアンサー
    • Perl
  • Mechanizeにおけるボタンクリックについて

    Perl Mechanizeを使って、下記HTMLの"表示"と表示されているボタンを押したいのですが、いろんなパターンを利用しても押せません。処理後の$mechのコンテンツをテキストで見ると、処理前後で更新(html遷移)がありません。試した、パターンは以下です。ActivePerl Verは5.8.8、OSはWindows XP SP2、mechanizeはver0.72です。 また、$mech->click_button('value' => '表示');を使うため、mechanizeをPPMを使ってver1.54にUpdateすると、 「Can't call method "header" on an undefined value at C:/Perl/site/lib/WWW/Mechanize.pm line 2347.」 というエラーがでて、click_button()のところでストップします。Mechanize.pmでuseしている各種パッケージをUpdateしても同様なエラーが出てclick_button()のところでストップします。 下記対象htmlのボタンを押すにはどうしたらよいでしょうか?皆様、よろしくお願いします。 1.パターン1 $mech->submit_form(  form_number => '1',   fields => {    0 => "1",    1 => "2",   }, ); 2.パターン2 $mech->submit_form(  form_number => '1',   fields => {    0 => "1",    1 => "2",   },  button => '' ); 3.パターン3 $mech->form_number(1); $mech->field( 0, 1 ); $mech->field( 1, 2 ); $mech->click(); 4.パターン4 $mech->form_number(1); $mech->field( 0, 1 ); $mech->field( 1, 2 ); $mech->submit(); 5.対象html <html><head><title>タイトル</title></head><body> ■中タイトル1<br><br><form action="/URL" method="post"><input type="hidden" name="NAME" value="ABCD"> [小タイトル1] <br><select name="0"> <option value="0">AAA</option> <option value="1">BBB</option> <option value="2">CCC</option> <option value="3">DDD</option> </select><br> [小タイトル2]<br> <select name="1"> <option value="0">AAA</option> <option value="1">BBB</option> <option value="2">CCC</option> </select><br> <input type="submit" value="表示"></form> <hr>該当データなし。<br><hr>

    • ベストアンサー
    • Perl