2012-06-06 5 views
0

Итак, я работаю над искателем, а некоторые данные, которые я хочу хранить о сайтах, которые я сканирую, - это их IP-адрес. Я бы предпочел сделать это, не запустив свой сервер снова, так что все равно, чтобы получить эту информацию от LWP или WWW :: Mechanize после того, как вы уже запросили веб-страницу? Например:perl получить ip-сайт с помощью lwp или www :: mechanize

my $mech = WWW::Mechanize->new(); 
$mech->get($url); 
$ip = $mech->url_ip; 

Я просмотрел документацию LWP и WWW :: Mechanize, и я не могу найти что-нибудь, но я пропустил вещи раньше. Так кто-нибудь знает способ сделать это с одним из этих модулей? Или еще один подобный модуль, который может это сделать? Спасибо за помощь!

ответ

0

Использование Net::DNS. Вот простой пример:

my $resolver = Net::DNS::Resolver->new(); 
my $response = $Resolver->send("example.com", "A"); 
my @rr = grep { $_->type eq "A" } $response->answer; 
my $ip = $rr[0]->address; 
2

Если это просто произвольные (четырех-) записи А вы хотите сохранить, вы можете попробовать что-то вроде этого:

use strictures; 
use Perl6::Take qw(gather take); 
use Socket 1.96 qw(getaddrinfo getnameinfo AF_INET6 AF_INET SOCK_STREAM NI_NUMERICHOST NIx_NOSERV); 
# require 1.96 or better for NIx_NOSERV, ships with Perl 5.14 
⋮ 
my $host = $mech->url->host; 
my @ip = gather { 
    for my $family (AF_INET6, AF_INET) { 
     my ($err, @addrinfo) = getaddrinfo($host, 'http', { family => $family, socktype => SOCK_STREAM }); 
     warn "Cannot getaddrinfo - $err" if $err; 
     for my $ai (@addrinfo) { 
      my ($err, $ipaddr) = getnameinfo($ai->{addr}, NI_NUMERICHOST, NIx_NOSERV); 
      warn "Cannot getnameinfo - $err" if $err; 
      take $ipaddr; 
     } 
    }; 
}; 
+0

FYI: NIx_NOSERV требует гнезда 1,96 или выше ; отредактирует – LeoNerd

+0

Оригинальный метод quick'n'dirty: 'join (". ", unpack (" W4 ", скалярный gethostbyname" stackoverflow.com "))' –

Смежные вопросы