我有一个我想从不同站点下载的PDF文件的列表。
在我的Firefox中,我选择了将PDF文件直接保存到特定文件夹的选项。
我的计划是使用www :: Mechanize :: perl中的firefox下载每个文件(在列表中 - 一一)使用firefox并在下载后重命名文件。
我使用以下代码进行操作:
use WWW::Mechanize::Firefox;
use File::Copy;
# @list contains the list of links to pdf files
foreach $x (@list) {
my $mech = WWW::Mechanize::Firefox->new(autoclose => 1);
$mech->get($x); #This downloads the file using firefox in desired folder
opendir(DIR, "output/download");
@FILES= readdir(DIR);
my $old = "output/download/$FILES[2]";
move ($old, $new); # $new is the URL of the new filename
}
运行文件时,它将打开Firefox中的第一个链接,Firefox将文件下载到所需的目录。但是,此后,"新标签"没有关闭,并且文件不会重命名,并且代码保持运行(就像遇到无尽的循环),并且没有进一步的文件下载。
这里发生了什么?为什么代码不起作用?如何关闭选项卡并使代码读取列表中的所有文件?是否有其他下载方法?
解决了问题。
功能,
$mech->get()
等待页面加载时Firefox发射的" Domcontentloaded" Firefox事件。当我设置Firefox自动下载文件时,没有加载页面。因此,从未解雇" Domcontentloade"事件。这导致我的代码中暂停。
我设置了该功能,以免使用以下选项
来加载页面$mech->get($x, synchronize => 0);
之后,我添加了60秒的延迟,以允许Firefox在代码进行之前下载文件
sleep 60;
因此,我的最终代码看起来像
use WWW::Mechanize::Firefox;
use File::Copy;
# @list contains the list of links to pdf files
foreach $x (@list) {
my $mech = WWW::Mechanize::Firefox->new(autoclose => 1);
$mech->get($x, synchronize => 0);
sleep 60;
opendir(DIR, "output/download");
@FILES= readdir(DIR);
my $old = "output/download/$FILES[2]";
move ($old, $new); # $new is the URL of the new filename
}
如果我正确理解您,则有指向实际PDF文件的链接。在这种情况下,www ::机械化很可能比www ::机械化:: firefox更容易。实际上,我认为情况几乎总是如此。再说一次,观看浏览器的工作肯定会更酷。
use strict;
use warnings;
use WWW::Mechanize;
# your code here
# loop
my $mech = WWW::Mechanize->new(); # Could (should?) be outside of the loop.
$mech->agent_alias("Linux Mozilla"); # Optionally pretend to be whatever you want.
$mech->get($link);
$mech->save_content("$new");
#end of the loop
如果绝对不是您想要的,我的封面故事是我不想打破我的666代表!