我尝试从服务器下载图像。我到目前为止尝试了,
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">
我已经拥有从网站解析的图片的链接,但我想下载此图片。我该怎么办?
答案 0 :(得分:3)
find_image
method of WWW::Mechanize 返回一个WWW::Mechanize::Image对象。它只包含有关图像的URI,文件名和alt标签信息,而不包含图像本身的内容。您需要先下载图像文件。
幸运的是,您可以使用$mech
。 $image
有a 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答案。但它会给出您需要的结果。