Qualche annetto fa, ho avuto la necessità di (far finta 😉 ) di ottenere svariati indirizzi email dal portale Pagine Gialle per contattare qualche azienda di una determinata categoria merceologia. In quel periodo studiavo PERL quindi perché non provarci 🙂 Ora, a distanza di anni, ritrovo lo script e da bravo Opensourcer pubblico qui l’estrattore.
Non ho verificato se sia ancora possibile estrarre indirizzi email da Pagine Gialle poiché probabilmente il portale avrà cambiato qualche parametro. Sono sicuro però che con qualche semplice modifica può tornare funzionante 😉 .
NB: inviare e-mail ad indirizzi che non hanno prestato il consenso è reato. Lo script è rilasciato a scopo di ricerca, si diffida ogni uso illecito.
#! usr/bin/perl
$queryString='http://www.paginegialle.it/pgol/p-1/4-'; $keywords = $ARGV[0]; $location = $ARGV[1]; $raggio = $ARGV[2]; unless(open DATI, '>' . 'export.txt') { die "\nNon è stato possibile creare il file di esportazione\n"; } ########################################################################################################## ######################## Creo il finto Browser ########################################################### ########################################################################################################## #use strict; #use warnings; use LWP::UserAgent; use HTTP::Cookies;
$ua = LWP::UserAgent->new(); print "Fake browser creato.\n";
$cookies = HTTP::Cookies->new( file => "cookies.txt", autosave => 1, ); print "Ricezione cookies abilitata.\n";
$ua->cookie_jar($cookies); print "Codifica cookies effettuata.\n";
$ua->agent("Windows IE 7"); print "Dichiarazione di essere il browser più scadente in circolazione comunicata ;)\n";
########################################################################################################## ######################## Rendo GET friendly la keyword della categoria da ricercare ###################### ########################################################################################################## $keywords =~ s/\s/%20/g; $queryString=$queryString.$keywords;
########################################################################################################## ######################## Rendo GET friendly la location da ricercare ##################################### ########################################################################################################## if($location){ $location =~ s/\s/%20/g; $queryString = $queryString."/3-".$location; }
########################################################################################################## ######################## Porto al massimo il numero di risultati per una pagina ########################## ########################################################################################################## $queryString = $queryString."?mr=50";
########################################################################################################## ######################## Rendo GET friendly il raggio entro il quale devo cercare ######################## ########################################################################################################## if($raggio){ if($raggio == '25'){ $queryString = $queryString."?&enl=7"; }elsif($raggio == '50'){ $queryString = $queryString."?&enl=8"; }elsif($raggio == '100'){ $queryString = $queryString."?&enl=9"; }else{ die "Formato raggio non corretto. Inserire '25' '50' o '100'"; } }
print "Query string pronta.\n"; $pageNumber = 1; ########################################################################################################## ######################## Calcolo il numero di pagina da visualizzare ##################################### ##########################################################################################################
for($i=1;$i<=$pageNumber;$i++){
$response = $ua->get($queryString); print "Scaricata la pagina $queryString di dimensione ".length($response->decoded_content)." bytes\n";
unless($response->is_success) { print "\nErrore nello scaricamento file HTML: " . $response->status_line."\n"; }
$fileOut = "result-$i.html";
unless(open OUT, '>' . $fileOut) { die "\nNon è stato possibile creare il file '$fileOut'\n"; } print "Creato il file $fileOut\n"; # Setto la codifica binmode(OUT, ":utf8");
print OUT $response->decoded_content;
close OUT; $fileIn = "result-$i.html"; open(IN,$fileIn); @contenuto=<IN>;
########################################################################################################## ######################## Verifico il numero di risultati trovati e lo memorizzo ########################## ########################################################################################################## if($i==1){ foreach (@contenuto){ if ($_ =~/<span class="h-bold">(\d+)<\/span>/){ $resultNumber= $1; print "Trovati $resultNumber risultati.\n"; break; } } }
$pageNumber = $resultNumber/50; $quote = $pageNumber/int($pageNumber); if($quote!=1){ $pageNumber = sprintf("%d", $pageNumber)+1; }
foreach (@contenuto) {
chomp ($_); if($_=~/<a title=\"Scheda Azienda (.+)\" class="_lms _noc"/) { $ragione_sociale = $1; $ragione_sociale =~ s/\&\;/\&/g; } elsif($_=~/\<span class\=\"street-address\"\>(.+)\, ([\w|\.|\s]+).+ class="locality">(\d\d\d\d\d) ([\w|\.|\s]+) \((\w\w)\)<\/span>/) { $civico = $1; $indirizzo = $2; $cap = $3; $citta = $4; $provincia = $5; } elsif($_=~/<div class="address">/){ $inizio = 1; } elsif($inizio==1 && $_=~/<span class\=\"type\"> tel\:<\/span>/){ $tel = 1; } elsif($inizio==1 && $_=~/^<span class=\"type\"> fax\:<\/span>/){ $fax = 1; } elsif($tel==1 && (($_=~/^<span class="value">([\d|\s]+), ([\d|\s]+)<\/span>/) || ($_=~/<span class="value">([\d|\s]+)<\/span>/)) ){ $tel1 = $1; $tel2 = $2; $tel = 0; } elsif($fax==1 && $_=~/^<span class="value">([\d|\s]+)<\/span>/ ){ $fax1 = $1; $fax = 0; } elsif($inizio==1 && $_=~/<\/div>/ ){ $inizio = 0; print DATI "$ragione_sociale,$indirizzo,$cap,$citta,$provincia,$tel1,$tel2,$fax1\n"; } } close(IN);
#Ogni pagina visitata, setto la nuova pagina da visitare $queryString =~ s/p-(\d*)/p-$i/; }
close (DATI);
Grazie per la dritta. Per caso sai se è ancora valida la procedura? Oppure se pagine gialle ha bloccato l’accesso?
Ciao, di recente non ho provato ma tutti i blocchi sono facilmente superabili. Ci può essere un blocco di richieste effettuate ogni X secondi, in questo caso si può inserire uno sleep tra una richiesta ed un’altra. Ci può essere un blocco per molte richieste provenienti dallo stesso indirizzo IP in questo caso si possono simulare le richieste da diversi indirizzi IP
ciao, sto cercando di creare uno script simile in python (e di perl ad ora, ahimè, non ci mastico molto). Volevo chiederti se riuscivi ad indicarmi il metodo che hai usato per estrapolare le mail dal sito, in quando (almeno sul nuovo portale di paginegialle, non sono visibili in chiaro. Se anche solo riesci a dirmi la porzione di codice usata per estrapolare la mail te ne sarei molto grato.
grazie mille. gabriele
Ciao Gabriele, lo script che ho proposto risale a qualche annetto fa e parserizzava direttamente la pagina di Pagine Gialle. Ora come tu giustamente dici la cosa non è possibile. Ma ti faccio notare che il sito web dell’azienda invece è in chiaro ;). Saluti. Simone
grazie mille della risposta, tuttavia se posso ne approfitto per porti un ulteriore domanda. nel codice di sopra non trovo menzionata la voce ‘email’, è quello che proprio mi manca (scusa ancora il disturbo!)
Hai perfettamente ragione! Ho ricostruito un pò il discorso. Tempo fa mi accorsi anche io che le mail non erano in chiaro quindi rimossi la porzione di codice che cattura le mail. Comunque sia, seguire il suggerimento che ti ho dato relativo all’indirizzo web dell’azienda e parserizzare poi con un semplice
if($_=~ /^[^@]+@+[^\.]+\.+[^\.]{2,6}$/)
ok grazie allora la mia stessa idea! grazie mille per la tua disponibilità! buona giornata! 🙂
io uso advanced email extractor. sembra che funzioni ma non benissimo. consigli?