2013-08-17 37 views
0

我刚刚开始学习一些基于Perl的Web应用程序,但是,我遇到了一个问题,我尝试编写一个Perl脚本来下载文件,在下载文件之前需要输入代码。作为一个例子,请看这个网址:http://epaper.dfdaily.com/dfzb/page/1/2013-08/17/A01/20130817A01_pdf.pdf如何使用Perl下载需要代码确认的文件?

我试图谷歌以某种方式我选择使用WWW :: Mechanize,如下面的代码,但我无法获得该文件。任何人都可以帮助我呢?非常感谢!!

我的代码在这里:(我想已经得到正确的代码,并将其存储到$代码):

my $mech = WWW::Mechanize -> new(); 
$mech -> get($url); 
$mech -> submit_form(
     form_number => 0, 
     fields => {checkCode => $code} 
    ); 

print $mech -> content; 
+0

对不起,中国的网址...但是这很容易理解。 :) –

+2

这是一个CAPTCHA。你需要作弊或成为一个人下载它。我怀疑StackOverflow用户不会帮助你欺骗验证码。 –

+0

如果您从网站管理员/所有者处获得以自动方式下载PDF的许可,也许他们也会提供仅使用HTTP身份验证(而不是CAPTCHA)的URL。 –

回答

0

这是示例代码来演示如何做到这一点。该代码将创建在程序目录captcha.jpg文件,这样你就可以后检查,并输入验证码:

use strict; 
use warnings; 
use FindBin qw($Bin); 
#use HTML::TreeBuilder::XPath; 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(); 
$mech->agent_alias("Windows IE 6"); 
$mech->get(
    "http://epaper.dfdaily.com/dfzb/page/1/2013-08/17/A01/20130817A01_pdf.pdf"); 

#you don't need commented code 
#because CAPTCHA URL is always the same for this site 
#my $tree = HTML::TreeBuilder->new_from_content($mech->content()); 
#my ($src) = $tree->findvalues('//img[@id="checkcode"]'); 
$mech->get("http://203.156.244.168:9000/validatecodegen"); 
open my $fh, ">:raw", "$Bin/captcha.jpg" or die $!; 
print {$fh} $mech->content(); 
close $fh; 
$mech->back(); 

print "Input CAPTCHA: "; 
my $code = <>; 
chomp $code; 
$mech->submit_form(

    with_fields => { 
     checkCode => $code, 

    }, 
    button => "Submit", 
); 

$mech->save_content("$Bin/result.pdf"); 
+0

非常感谢,这对我有很大帮助:) –