如何使用WWW :: Mechanize从网站下载图像文件?

时间:2015-07-21 12:58:07

标签: perl www-mechanize

我尝试从服务器下载图像。我到目前为止尝试了,

use warnings;
use strict; 
use WWW::Mechanize;

my $sequence = "MIPTLAAEPRKPARPPLPVRRESREEPVDAVIVGTGAGGAPLLARLAQAGLKVVALEAGNHWDPAADFATDEREQNKLFWFDERLSAGADPLAFGRNNSGIGVGGSTLHYTAYVPRPQPDDFRLYSDFGVGEDWPIGYGDLEPYFDELECFLGVSGPSPYPWGPARTPYPLAPMPLNAAAQLMARGCAALGLRTSPAANAVLSAPYFQSGVGWRSPCTNRGFCQAGCTTGGKAGMDVTFIPLALAHGAEVRSGAFVTRIETDRAGRVTGVVYVREGREERQRCRTLFLAAGAIETPRLLLLNGLANQSGEVGRNFMAHPGLQLWGQFSEATRPFKGVPGSLISEDTHRPKDADFAGGYLLQSIGVMPVTYATQTARGGGLWGEKLQSHMHGYNHTAGINILGECLPYAHNYLELSDEPDQRGLPKPRIHFSNGKNERRLRDHAEALMRRIWEAAGAQAVWTFERNAHTIGTCRMGADPKRAVVDPEGRAFDVPNLYIIDNSVFPSALSVNPALTIMALSLRTADRFIERTQRGEY";

my $mech = WWW::Mechanize -> new;
$mech->get('https://npsa-prabi.ibcp.fr/cgi-bin/npsa_automat.pl?page=/NPSA/npsa_sopma.html');
    $mech->submit_form(
        form_number => 1,
        fields => {
        'notice' => $sequence,
        },
    );


$mech->find_image( alt_regex => qr/.+sopma2.gif/ );
open (FH, ">soi.gif");
binmode (FH);
print FH $mech;

图片代码是这样的:

<img align="TOP" src="/tmp/e3a3c2b34201.sopma2.gif">

我已经拥有从网站解析的图片的链接,但我想下载此图片。我该怎么办?

4 个答案:

答案 0 :(得分:3)

find_image method of WWW::Mechanize 返回一个WWW::Mechanize::Image对象。它只包含有关图像的URI,文件名和alt标签信息,而不包含图像本身的内容。您需要先下载图像文件。

幸运的是,您可以使用$mech$imagea URI method,返回该图片文件的full URL。你的$mech can get那张图片。它来自HTTP :: Response。

my $image = $mech->find_image( url_regex => qr/sopma2\.gif$/ );
my $res = $mech->get($image->URI);

if ($res->is_success) {
  open (my $fh, '>', 'soi.gif') or die $!;
  binmode $fh;
  print $fh $res->decoded_content;
  # no need to close lexical filehandle
}

Et瞧,这是你的图像文件。

答案 1 :(得分:1)

您可以使用$mech->get(...)将网址内容存储到本地文件中。

if( my $image = $mech->find_image( alt_regex => qr/.+sopma2.gif/ )) {
  $mech->get( $img->url, ':content_file' => 'soi.gif');
}

How do i save an image with www::mechanize

man WWW::Mechanize

  

$ mech-&GT; find_image()
         在当前页面中查找图像。它返回一个描述图像的WWW :: Mechanize :: Image对象。如果找不到图像,则返回undef。
  ...
  $ mech-&gt; get($ uri)
         给定URL / URI,获取它。返回HTTP :: Response对象。 $ uri可以是格式良好的URL字符串,URI对象或WWW :: Mechanize :: Link对象。 [...]
  &#34;获得()&#34;是LWP :: UserAgent中方法的良好重载版本。这可以让你做一些事情   $mech->get( $uri, ':content_file' => $tempfile );

答案 2 :(得分:1)

问题是您正在搜索其alt文本包含字符串sopma2.gif的图像。该图片没有替代文字,因此您的程序无法找到它

该程序将获取您想要的gif文件。我使用url_regex => qr/sopma2/i代替了网址中的sopma2。成功并返回WWW::Mechanize::Image个对象。然后,所有必要的是获取该对象绝对URL并使用带有get参数的:content_file将数据保存到磁盘文件

use strict;
use warnings;
use 5.010;

use WWW::Mechanize;

STDOUT->autoflush;

my $sequence = "MIPTLAAEPRKPARPPLPVRRESREEPVDAVIVGTGAGGAPLLARLAQAGLKVVALEAGNHWDPAADFATDEREQNKLFWFDERLSAGADPLAFGRNNSGIGVGGSTLHYTAYVPRPQPDDFRLYSDFGVGEDWPIGYGDLEPYFDELECFLGVSGPSPYPWGPARTPYPLAPMPLNAAAQLMARGCAALGLRTSPAANAVLSAPYFQSGVGWRSPCTNRGFCQAGCTTGGKAGMDVTFIPLALAHGAEVRSGAFVTRIETDRAGRVTGVVYVREGREERQRCRTLFLAAGAIETPRLLLLNGLANQSGEVGRNFMAHPGLQLWGQFSEATRPFKGVPGSLISEDTHRPKDADFAGGYLLQSIGVMPVTYATQTARGGGLWGEKLQSHMHGYNHTAGINILGECLPYAHNYLELSDEPDQRGLPKPRIHFSNGKNERRLRDHAEALMRRIWEAAGAQAVWTFERNAHTIGTCRMGADPKRAVVDPEGRAFDVPNLYIIDNSVFPSALSVNPALTIMALSLRTADRFIERTQRGEY";

my $mech = WWW::Mechanize->new;
$mech->get('https://npsa-prabi.ibcp.fr/cgi-bin/npsa_automat.pl?page=/NPSA/npsa_sopma.html');

say $mech->res->status_line;
say $mech->title;

$mech->submit_form(
    form_number => 1,
    fields => {
      notice => $sequence,
    },
);

say $mech->res->status_line;
say $mech->title;

my $image = $mech->find_image( url_regex => qr/sopma2/i );
my ($file) = $image->url =~ m|([^/]+\z)|;
$mech->get($image->url_abs, ':content_file' => $file);
say "$file saved";

输出

200 OK
NPS@ : SOPMA secondary structure prediction
200 OK
NPS@ SOPMA secondary structure prediction results
373025433891.sopma2.gif saved

答案 3 :(得分:-1)

在WWW :: Mechanize中使用LWP::Simple

use WWW::Mechanize;
use LWP::Simple;
my $sequence = "MIPTLAA......";

my $mech = WWW::Mechanize -> new;
$mech->get('https://npsa-prabi.ibcp.fr/cgi-bin/npsa_automat.pl?page=/NPSA/npsa_sopma.html');
    $mech->submit_form(
        form_number => 1,
        fields => {
        'notice' => $sequence,
        },
    );

my $cont = $mech->content;  
($img) = $cont =~m/SRC=(.+sopma2\.gif)/g; 
$urL = "https://npsa-prabi.ibcp.fr/$img";
getstore($urL,"soi.gif");

$img存储图片的网址

然后使用getstore

中的LWP::Simple方法保存图像

这不是个好主意。请参阅@simbabque答案。但它会给出您需要的结果。