我有一个简单的要求,即屏幕抓取网页(基于简单 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 });