我有一个我想从不同网站下载的pdf文件的网址列表。
在我的firefox中,我选择了将PDF文件直接保存到特定文件夹的选项。
我的计划是在perl中使用WWW :: Mechanize :: 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会将该文件下载到所需目录。但是,之后“新标签”没有关闭,文件没有被重命名,代码一直在运行(就像遇到无限循环一样),没有其他文件被下载。
这里发生了什么?为什么代码不起作用?如何关闭选项卡并使代码读取列表中的所有文件?有没有其他的下载方式?
答案 0 :(得分:2)
解决了这个问题。
功能,
$mech->get()
等待' DOMContentLoaded' Firefox在页面加载时触发的事件。由于我已设置Firefox自动下载文件,因此没有加载页面。因此,' DOMContentLoaded'事件从未被解雇。这导致我的代码暂停。
我将函数设置为不等待页面加载使用以下选项
$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
}
答案 1 :(得分:1)
如果我理解正确,您可以获得实际pdf文件的链接。 在这种情况下,WWW :: Mechanize最有可能比WWW :: Mechanize :: 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代表!