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