У меня есть список URL-адресов PDF-файлов, которые я хочу загрузить, с разных сайтов.
В моем firefox я выбрал возможность сохранять файлы PDF непосредственно в определенную папку.
Я планировал использовать WWW :: Mechanize :: Firefox в perl для загрузки каждого файла (в списке - один за другим) с помощью 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 загружает файл в желаемый каталог. Но после этого «новая вкладка» не закрывается, файл не переименовывается, а код продолжает работать (например, возник бесконечный цикл), и никакие другие файлы не загружаются.
Что здесь происходит? Почему код не работает? Как закрыть вкладку и заставить код читать все файлы в списке? Есть ли альтернативный способ загрузки?
$x
, но пытаетесь получить неопределенное значение$link
. (2) Вы предполагаете, что$FILES[2]
содержит только что загруженный файл. (3) В Perl нет встроенногоmove
sub - он называетсяrename
. - person Richard Huxton   schedule 11.03.2014$link
была опечаткой при редактировании вопроса, это$x
указывает на ссылки. Я проверил, что$FILES[2]
указывает на файл, так как в моем каталоге только 1 файл, а первые 2 элемента массива - это '.' и '..'. Аmove
- это метод в File :: Copy. Я внес изменения в вопрос - person Pawan Samdani   schedule 11.03.2014get
(проще всего, вставив печать после нее), я бы предположил, что все, чтоget
использует, чтобы определить, все ли загружено, плохо работает с вашим автоматическим скачивание. Вы можете попробоватьget_local
и / или использовать параметрcontent_file
для загрузки файла вместо некоторого автоматического поведения Firefox, о котором ваш скрипт не знает. Или вы откажетесь от firefox и просто используете WWW :: Mechanize, не прибегая к причудливым конфетам в виде удаленного управления каким-нибудь браузером, за которым вы можете наблюдать. - person DeVadder   schedule 11.03.2014get_local
метод заключается в загрузке локальных файлов.content_file
находится в WWW :: Mechanize, а не в WWW :: Mechanize :: Firefox - person Pawan Samdani   schedule 11.03.2014get_local
. Но хотя WWW :: Mechanize, вероятно, намного сложнее, он может использовать прокси. Однако я ясно вижу:content_file
как вариант дляget
в документации Mechanize :: Firefox. И я все же буду утверждать, что лучше делать все из сценария вместо того, чтобы Firefox автоматически загружал ссылки в формате pdf. Кроме того, Mechanize :: Firefox возвращает поддельные объекты HTTP :: Response, поэтому->content
также может работать. Наконец, если вы никуда не торопитесь, вы можете добавить достаточно большой таймаут к вызовуget
, игнорируя тот факт, что он не знает, когда это будет сделано. - person DeVadder   schedule 11.03.2014get
, возможно, ожидает ответа на загрузку страницы из Firefox, чтобы продолжить. Поскольку Firefox загружал файлы, страница не загружалась. Таким образом, я установилget
, чтобы он не ждал ответа, и добавил тайм-аут 60 секунд. И это сработало. - person Pawan Samdani   schedule 12.03.2014