Как я могу загрузить цели ссылок с веб-сайта, используя Perl? - PullRequest
4 голосов
/ 06 июля 2010

Я только что создал скрипт для получения ссылок с веб-сайта и, в свою очередь, сохраняет их в текстовом файле.

Теперь я работаю над своими регулярными выражениями, поэтому он будет получать ссылки, содержащие php?dl= в URL из текстового файла:

Например: www.example.com/site/admin/a_files.php?dl=33931

Егов основном адрес, который вы получаете, когда наводите курсор на кнопку dl на сайте.Из которого вы можете щелкнуть, чтобы загрузить или «сохранить правой кнопкой мыши».

Мне просто интересно, как этого добиться, загружая контент по указанному адресу, который будет загружать файл *.txt.Все из сценария, конечно.

Ответы [ 4 ]

7 голосов
/ 06 июля 2010

Сделайте WWW::Mechanize вашим новым лучшим другом.

И вот почему:

  • Он может идентифицировать ссылки на веб-странице, которые соответствуют определенному регулярному выражению (/php\?dl=/ в данном случае)
  • Он может переходить по этим ссылкам через follow_link метод
  • Может get цели этих ссылок и сохранять их в файл

Все это без необходимости сохранять нужные ссылки в промежуточном файле! Жизнь прекрасна, когда у тебя есть подходящий инструмент для работы ...


* ** 1 022 тысяча двадцать-один * Пример
use strict;
use warnings;
use WWW::Mechanize;

my $url  = 'http://www.example.com/';
my $mech = WWW::Mechanize->new();

$mech->get ( $url );

my @linksOfInterest = $mech->find_all_links ( text_regex => qr/php\?dl=/ );

my $fileNumber++;

foreach my $link (@linksOfInterest) {

    $mech->get ( $link, ':contentfile' => "file".($fileNumber++).".txt" );
    $mech->back();
}
3 голосов
/ 06 июля 2010

Вы можете загрузить файл с помощью LWP :: UserAgent :

my $ua = LWP::UserAgent->new();  
my $response = $ua->get($url, ':content_file' => 'file.txt');  

Или, если вам нужен дескриптор файла:

open my $fh, '<', $response->content_ref or die $!;
3 голосов
/ 06 июля 2010
0 голосов
/ 30 октября 2013

Старый вопрос, но когда я делаю быстрые сценарии, я часто использую "wget" или "curl" и pipe. Возможно, это не переносимость между системами, но если я знаю, что в моей системе есть одна или другая из этих команд, это обычно хорошо.

Например:

#! /usr/bin/env perl
use strict;
open my $fp, "curl http://www.example.com/ |";
while (<$fp>) {
  print;
}
...