0

我正在使用LWP::UserAgent请求大量页面内容。我已经知道我请求的 url 的 ip,所以我希望能够指定托管我请求的 url 的 ip 地址,这样 LWP 就不必花时间进行 dns 查找。我浏览了文档,但没有找到任何解决方案。有谁知道这样做的方法?谢谢!

4

3 回答 3

7

所以我找到了一个完全符合我要求的模块:LWP::UserAgent::DNS::Hosts

这是我测试并执行我在问题中指定的示例脚本:

#!/usr/bin/perl 
use strict;
use LWP::UserAgent;
use LWP::UserAgent::DNS::Hosts;

LWP::UserAgent::DNS::Hosts->register_host(
        'www.cpan.org' => '199.15.176.140',
);

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;

#actually enforces new DNS settings as if they were in /etc/hosts
LWP::UserAgent::DNS::Hosts->enable_override;

my $response = $ua->get('http://www.cpan.org/');

if ($response->is_success) {
    print $response->decoded_content;  # or whatever
}
else {
    die $response->status_line;
}
于 2012-09-15T00:38:38.337 回答
6

嗯,你的系统应该已经在缓存 DNS 响应了。您确定此优化会有所帮助吗?


选项1。

利用

http://192.0.43.10/

代替

http://www.example.org/

当然,如果服务器执行基于名称的虚拟主机,那将失败。


选项 2。

用缓存版本替换Socket::inet_aton(从 LWP::Protocol::http 调用的 IO::Socket::INET 调用)。

use Socket qw( );
BEGIN {
    my $original = \&Socket::inet_aton;

    my %cache;
    my $caching = sub {
       return $cache{$_[0]} //= $original->($_[0]);
    };

    no warnings 'redefine';
    *Socket::inet_aton = $caching;
}
于 2012-09-15T00:02:23.173 回答
-3

只需将域名替换为 URL 中的 IP 地址即可:

use strict;
require LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;

# my $response = $ua->get('http://stackoverflow.com/');
my $response = $ua->get('http://64.34.119.12/');

if ($response->is_success) {
    print $response->decoded_content;  # or whatever
}
else {
    die $response->status_line;
}
于 2012-09-15T00:01:33.520 回答