Perl WWW :: Mechanize方法在AIX中不起作用

时间:2012-07-10 22:23:55

标签: perl cpan aix www-mechanize

我有一个简单的要求:屏幕抓取网页(简单的基于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机器上运行。

更新 - 我尝试连接的网站似乎有一个不受信任的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 });

1 个答案:

答案 0 :(得分:1)

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

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;