2010-07-06 7 views
4

Je viens de créer un script pour récupérer les liens d'un site web, et à son tour les enregistre dans un fichier texte.Comment puis-je télécharger des cibles de liens à partir d'un site Web à l'aide de Perl?

Maintenant, je travaille sur mes regexes il va récupérer des liens qui contient php?dl= dans l'URL du fichier texte:

Par exemple: www.example.com/site/admin/a_files.php?dl=33931

Son à peu près l'adresse que vous obtenez lorsque vous survolez le bouton dl sur le site. A partir de laquelle vous pouvez cliquer pour télécharger ou "clic droit sauvegarder".

Je me demandais simplement comment y parvenir, en ayant à télécharger le contenu de l'adresse donnée qui va télécharger un fichier *.txt. Tout du scénario bien sûr.

+0

Quelle est la question ici? Vous avez créé un script et souhaitez le télécharger uniquement certaines URL? Êtes-vous à la recherche d'une expression rationnelle? – Konerak

+0

J'essaie de comprendre comment vous téléchargez le fichier associé à l'URL. Par exemple, sur le site Web, vous cliquez sur l'icône/bouton «dl» et votre navigateur télécharge automatiquement le fichier pour vous. ie: http://www.example.com/site/admin/a_files.php?dl=33931 téléchargerait "fichier1.txt" Je me demandais simplement comment vous pouvez télécharger le fichier en Perl. La partie regexp n'est pas un problème. Ou ai-je manqué une fonction qui peut faire tout cela avec facilité haha ​​ – eraldcoil

Répondre

7

Faire WWW::Mechanize votre nouveau meilleur ami.

Voici pourquoi:

  • Il peut identifier les liens sur une page Web qui correspondent à une expression régulière spécifique (/php\?dl=/ dans ce cas)
  • Il peut suivre ces liens par la méthode follow_link
  • Il peut get la cibles de ces liens et les enregistrer dans le fichier

Tout cela sans avoir à enregistrer vos liens utiles dans un fichier intermédiaire! La vie est douce quand vous avez le bon outil pour le travail ...


Exemple

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(); 
} 
+0

Awesome!vous avez déclaré toutes les choses que je cherchais, depuis deux heures lol. Merci: D – eraldcoil

+0

Cela a beaucoup aidé. Merci beaucoup: D. J'ai encore beaucoup à apprendre encore, merci de signaler ce module très utile: D – eraldcoil

+0

Je ne vois aucune raison dans cet exemple de faire les -> back() et -> reload(). –

3

Vous pouvez télécharger le fichier avec LWP::UserAgent:

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

Ou si vous avez besoin un handle de fichier:

open my $fh, '<', $response->content_ref or die $!; 
+0

ahhh ic c'est comme ça que vous l'utilisez. Merci: D – eraldcoil

+2

Ou, utilisez juste 'LWP :: Simple :: getstore ($ url, $ fichier) '. –

0

Vieille question, mais quand je fais des scripts rapides, j'utilise souvent "wget" ou "curl" et pipe. Ce n'est peut-être pas trans-système portable, mais si je sais que mon système a l'une ou l'autre de ces commandes, c'est généralement bon.

Par exemple:

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