LWP :: UserAgent设置所请求URL的ip,因此LWP不必进行dns查找

src*_*ulo 0 ip dns perl lwp lwp-useragent

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

src*_*ulo 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;
}
Run Code Online (Sandbox Code Playgroud)

  • **凉!建议改进**:在调用`register_host`之前动态查找主机.(作为'www.cpan.org'=>'199.15.176.140'中硬编码IP地址的替代方法. (2认同)

ike*_*ami 6

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


选项1.

使用

http://192.0.43.10/
Run Code Online (Sandbox Code Playgroud)

代替

http://www.example.org/
Run Code Online (Sandbox Code Playgroud)

当然,如果服务器执行基于名称的虚拟主机,则会失败.


选项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;
}
Run Code Online (Sandbox Code Playgroud)

  • @DavidRR,第二个选项根本不会改变LWP请求.它只是将名称解析器替换为总是返回与之前相同的答案(假设DNS响应在程序的生命周期内是静态的),而不是在某些时候不使用OS调用. (2认同)