2016-11-26 57 views
1

我試圖訪問使用Perl5和LWP :: UserAgent的站點。然而,在連接時,腳本將以「403訪問被拒絕」消息而死亡。奇怪的部分是它使用WWW :: Mechanize完美地工作,但取回代碼完全相同。 通常我會懷疑用戶代理是原因,但如前所述,代碼在兩種情況下都是相同的。使用LWP :: UserAgent時出現403錯誤,但沒有使用WWW :: Mechanize

WWW :: Mechanize和LWP :: UserAgent如何處理可能導致此問題的請求?

下面是一些演示兩種不同方法的示例代碼。

# Mechanize 
use strict; 
use warnings "all"; 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(
    agent_alias => 'Mozilla/5.0', 
    show_progress => 1); 

my $mech->get("www.foo.com"); 

# LWP 
use strict; 
use warnings "all"; 
use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(
    agent_alias => 'Mozilla/5.0', 
    show_progress => 1); 

my $r = $ua->get("www.foo.com"); 

回答

2

沒有agent_alias參數記錄,既沒有LWP :: UserAgent也沒有WWW :: Mechanize。並且也沒有agent_alias參數實現。相反參數在兩種情況下均被忽略,而使用內置默認值。但默認值不同。對於WWW :: Mechanize,有一個agent_alias方法。從the documentation

...例如,

$mech->agent_alias('Windows IE 6'); 

套你的用戶代理

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 

按照documentation of LWP::UserAgent你實際上要使用的說法是正確的稱爲agent,默認爲libwww-perl/#.####.###是版本號)。使用WWW :: Mechanize可以使用相同的參數,但記錄的不同默認值是WWW-Mechanize/#.##

+0

很高興地說'new'的正確參數叫做'agent',你應該說默認的用戶代理字符串是什麼 – Borodin

+1

@Borodin:你說得對。我已將這些信息添加到我的答案中。 –

+0

謝謝。看起來奇怪的是,一個網站會爲'libwww-perl'返回* Forbidden *,而不是'WWW-Mechanize'。它必須是一個硬編碼的排除,而不是一個非常有效的排除! – Borodin

相關問題