如何使用WWW :: Mechanize或任何Perl模块下载文件?

时间:2010-02-15 02:00:46

标签: perl file www-mechanize

访问网站后,WWW::Mechanize或任何Perl模块是否有办法读取文件。例如,我单击了一个按钮'接收',将出现一个包含消息的文件(.txt)。我怎样才能阅读内容?答案非常感谢..我已经在这方面工作了好几天,而且,我尝试了所有的可能性。有人可以帮忙吗?如果你能给我一个想法吗? :)

以下是我的代码的一部分:

...

my $username = "admin";<br>
my $password = "12345";<br>

my $url = "http://...do_gsm_sms.cgi";

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, agent_alias =>$login_agent, cookie_jar => $cookie_jar);

$mech->credentials($username, $password);<br>
$mech->get($url);

$mech->success() or die "Can't fetch the Requested page";<br>

print "OK! \n"; #This works <br> 

$mech->form_number(1);

$mech->click()

在此之后,将出现“下载”对话框,以便我可以保存文件(但我也可以将默认值设置为立即打开而不是保存)。问题是,我该如何阅读这个文件的内容?

...

6 个答案:

答案 0 :(得分:4)

我认为您的意思是网站通过返回您希望保存的非HTML响应(比如'text / plain'文件)来响应表单提交。

我相信你想要$mech->save_content( $filename )

<强>加了:

首先,在保存生成的(文本)文件之前,您需要提交 WWW:Mech的表单提交。 click适用于clicking a button,而您想使用$mech->submit()$mech->submit_form( ... )提交表单。

#!/usr/bin/perl

use strict;
use warnings;

use WWW::Mechanize;

my $username = "admin";
my $password = "12345";
my $login_agent = 'WWW::Mechanize login-agent';
my $cookie_jar;

#my $url = "http://localhost/cgi-bin/form_mech.pl";
my $url = "http://localhost/form_mech.html";

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, 
               agent_alias => $login_agent, cookie_jar => $cookie_jar
           );

$mech->credentials($username, $password);
$mech->get($url);

$mech->success() or die "Can't fetch the Requested page";

print "OK! \n"; #This works

$mech->submit_form(
   form_number => 1,
);
die "Submit failed" unless $mech->success;

$mech->save_content('out.txt');

答案 1 :(得分:2)

点击后(假设它正在做它应该做的事情),返回的数据应该存储在你的$ mech对象中。您应该能够使用$mech->content()获取文件数据, 也许在使用$mech->status()验证成功和使用$mech->content_type()验证回复的类型后。

您可能会发现WWW :: Mechanize 替换浏览器会很有帮助;浏览器本来会做的任何事情,例如调出下载窗口并保存文件,实际上并没有发生,但是浏览器所拥有的所有信息都可以通过WWW :: Mechanize的方法访问。

答案 2 :(得分:1)

我敢问......你试过这个吗?

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

答案 3 :(得分:1)

打开文件(而非“下载”窗口),就像您在浏览器中查看一样;你可以稍后用几行代码保存它。

如果您已安装HTML::TreeBuilder

my $textFile = $mech->content(format => "text");

应该会显示打开的结果窗口的文本。

然后打开文件句柄将结果写入:

open my $fileHandle, ">", "results.txt";
print $fileHandle $textFile;
close $fileHandle;

答案 4 :(得分:1)

我一直用LWP这样做,但我确信它与Mech一样可能

我认为当你真正想要从页面中请求按钮导致在点击时发送到浏览器的内容时​​,你可能出错的地方就是使用Mech来请求包含该按钮的页面。

您需要做的是使用启动下载的按钮查看页面的html源代码,并查看与该按钮关联的操作。很可能它是一个带有一些隐藏字段的POST或一个用于执行GET的URL。

Click的目标网址包含您实际想要获取的内容,而不是包含该按钮的网页的网址。

答案 5 :(得分:1)

对于这样的问题,您经常需要调查浏览器处理的完整事件链。使用HTTP嗅探器工具查看浏览器正在执行的所有操作,直到它到达文件文件。然后你必须在Mech做同样的事情。