使用Perl WWW :: Mechanize :: Firefox在Firefox中下载

时间:2014-03-11 08:15:22

标签: perl firefox www-mechanize www-mechanize-firefox

我有一个我想从不同网站下载的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会将该文件下载到所需目录。但是,之后“新标签”没有关闭,文件没有被重命名,代码一直在运行(就像遇到无限循环一样),没有其他文件被下载。

这里发生了什么?为什么代码不起作用?如何关闭选项卡并使代码读取列表中的所有文件?有没有其他的下载方式?

2 个答案:

答案 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代表!