2012-09-14 62 views
0

我使用LWP::UserAgent来请求大量的页面内容。我已经知道我请求的网址的IP地址,所以我希望能够指定我请求的网址的IP地址,以便LWP不必花时间进行DNS查找。我浏览过文档,但没有找到任何解决方案。有谁知道一种方法来做到这一点?谢谢!LWP :: UserAgent设置请求的URL的IP,以便LWP不必做DNS查找

+0

也许$ ua-> get('http:// IP_ADDRESS/REST_OF_URL'); ? – snoofkin

+0

我认为这不会起作用,因为某些托管依赖于请求中使用的域名,并且如果该服务器用于托管多个域,则不知道将请求指向何处。 – srchulo

+0

嗯......但你说“我已经知道我请求的网址的IP”......和@ soulSurfer2010,我只是说在你的URL中嵌入IP地址本身。你是否在反思这个问题,还是我们没有把握你的问题? – DavidRR

回答

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

**酷!建议的改进**:在调用'register_host'之前动态查找主机。 (作为对'www.cpan.org'=>'199.15.176.140''中的IP地址进行硬编码的替代方案。 – DavidRR

-3

只需在您的网址的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; 
} 
+1

这不会将相同的请求发送到服务器。 – hobbs

+0

@hobbs:'nslookup stackoverflow.com' =>'Name:stackoverflow.com','Address:64.34.119.12'。或者,您是否认为@ikegami会这样做:“当然,如果服务器执行基于名称的虚拟主机服务,则会失败。”但那是***如果***。 – DavidRR

+1

我没有说它会将请求发送到错误的地方,我说它不会发送*相同的请求*。它不会,因为它不包含'Host:stackoverflow.com'。 – hobbs

6

哼,你的系统应该已经被缓存DNS响应。你确定这个优化会有帮助吗?


选项1.

使用

http://192.0.43.10/ 

,而不是

http://www.example.org/ 

当然,如果服务器不基于域名的虚拟主机,将失败。


选项2

替换Socket::inet_aton(从IO称为::插座:: INET从LWP ::协议:: HTTP调用)与高速缓存版本。

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

那么我会把这个代码放在哪里?你能向我解释它在做什么吗? – srchulo

+0

在您的计划的早期阶段。它必须在使用IO :: Socket :: INET之前做任何事情,因此它必须在使用LWP之前进行。 (你可以通过添加一个print语句来确保它被调用。)它用你自己的缓存版本替换了'Socket :: inet_aton'。 'inet_aton'用于解析域名(并打包IP地址)。 – ikegami

+0

那么,准确地说,你的解决方案最终具有指示客户端在其请求中的HTTP主机头中设置正确值的效果?例如'Host:stackoverflow.com' – DavidRR

相关问题