【问题标题】:Perl WWW::Mechanize methods not working in AIXPerl WWW::Mechanize 方法在 AIX 中不起作用
【发布时间】:2012-07-10 11:54:45
【问题描述】:

我有一个简单的要求,即屏幕抓取网页(基于简单 URL 的报告)并将 HTML 响应定向到输出文件。但是,该 URL 将重定向到具有“基于表单”身份验证(无 javascript)的身份验证(HTTPS 登录)页面,并且在身份验证后,我尝试查看的报告应显示在 $response(作为 HTML)中。有趣的是,我的代码在 Windows 机器上工作得很好,但是下面的相同代码在 AIX 机器上不工作,看起来click_button() 函数调用什么都不做。我已经尝试过click()submit(),但都没有工作,所以我得到的不是实际报告,而是 HTML 输出文件中的登录屏幕。任何想法,有什么问题?

use WWW::Mechanize;
use strict;

my $username = "admin";
my $password = "welcome1";  
my $outpath  = "/home/data/output";
my $fromday = 7;
my $url  = "https://www.myreports.com/tax_report.php";
my $name = "tax_report";
my $outfile = "$outpath/$name.html";

my $mech = WWW::Mechanize->new(noproxy =>'0');  

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; 
$mon++;     # since it will start from 0
$mday--;    # yesterdays date (to day)
$fromday = $mday - $days; #(from day)

#Create URL extension for generating report with previous date
my $dt_range = "?Y&dc_date1=$mon%2F$fromday%2F$year&dc_date2=$mon%2F$mday%2F$year"; 
my $url  = $url . $dt_range;

$mech->get($url);
$mech->field(login => "$username");
$mech->field(passwd => "$password");

$mech->add_handler("request_send",  sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });

$mech->click_button(value=>"Login now");

my $response = $mech->content();

print "Generating report: $name...\n";

open (OUT, ">>$outfile")|| die "Cannot create report file $outfile";
print OUT "$response";
close OUT;

两台机器中的 WWW::Mechanize 版本相同,即 1.54,但 Win 机器的 perl 版本是 5.10.1,而 AIX 机器的 Perl 版本是 5.8.8。

使用的其他替代品 -

my $inputobject=$mech->current_form()->find_input( undef,'submit' );
print $inputobject->value . "\n";
$mech->click_button(input => $inputobject);
print $mech->status() . "\n";

$inputobject 显示了 HTML 源代码中的正确按钮元素,第二次打印返回的状态为 200,显然代表 OK。但它仍然无法在 AIX 机器上运行。

UPDATE- 我尝试连接的站点似乎具有不受信任的 SSL 证书。我在三台不同的机器 Windows PC、Mac 和 AIX 上尝试了该程序。在 Windows 机器上,该程序可以运行,我能够通过浏览器(Chrome、Firefox、IE)登录到该网站。但是在 Mac 中,登录不起作用(通过浏览器)并且它显示一个不受信任的证书错误(或警告!)这可能意味着代理设置没有设置,Perl 程序也不起作用。最后是 Perl 不能正常工作的 AIX。不确定如何在此处绕过此不受信任的 SSL 证书问题。任何帮助将不胜感激。

UPDATE2:在脚本中包含以下代码行以查看日志记录详细信息,并发现我被重定向(HTTP 302),因为我的 IP 已被服务器防火墙过滤。一旦将 AIX ip 添加到服务器的防火墙异常中,该脚本就可以完美运行。下面的两行是救命稻草-

$mech->add_handler("request_send",  sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });

【问题讨论】:

    标签: perl cpan aix www-mechanize


    【解决方案1】:

    您可以在您的 perl 代码的 my $mech = WWW::Mechanize->new(noproxy =>'0'); 之前使用以下行并重试吗?

    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;
    

    【讨论】:

    • Daxim,我已经尝试过 noproxy=> 0 但它不起作用。我今天早上发现的另一件事是,“POST”在 AIX 机器中返回“HTTP/1.1 302 Found”,而在 Windows 机器中,相同的代码和相同的 URL 返回“HTTP/1.1 200 OK”。不确定它试图重定向到哪里。
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2011-12-14
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多