perl使用lwp或www :: mechanize获取网站的ip

时间:2012-06-06 03:27:09

标签: perl ip web-crawler www-mechanize lwp

所以我正在处理一个爬虫,我想要存储的有关我抓取的网站的一些数据是他们的IP地址。我更喜欢这样做,而不必再次点击他们的服务器,所以在你已经请求网页后,无论如何都要从LWP或WWW :: Mechanize获取这些信息?例如:

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

我查看了LWP和WWW :: Mechanize的文档,我似乎无法找到任何东西,但我之前错过了一些东西。那么有谁知道用这些模块之一做到这一点的方法?或者甚至是另一个可以做到的类似模块?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

如果它只是你想要存储的任意(四个)A记录,你也可以尝试这样的事情:

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;
        }
    };
};

答案 1 :(得分: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;