2012-09-14 89 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

相關問題