2016-11-26 9 views
1

Perl5 및 LWP :: UserAgent를 사용하여 사이트에 액세스하려고합니다. 그러나 연결시 스크립트는 "403 access denied"메시지와 함께 사망합니다. 이상한 부분은 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

는 어느 LWP :: 해당 UserAgent를 위해도 WWW 문서화에는 agent_alias 인수가 없습니다 :: 기계화. 또한 구현 된 인수는 agent_alias입니다. 대신 인수는 두 경우 모두 무시됩니다.은 기본 기본값 인을 사용합니다. 그러나 기본값은 다른입니다. WWW :: Mechanize의 경우 방법이 있습니다. the documentation에서 : 예를 들어

...,

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

세트 당신의 사용자 에이전트 documentation of LWP::UserAgent 당신이 실제로 사용하려는 주장에 따르면

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

에 제대로입니다 agent이라고하며 기본값은 libwww-perl/#.###입니다 (#.###은 버전 번호 임). WWW :: Mechanize를 사용하면 동일한 인수를 사용할 수 있지만 문서화 된 다른 기본값은 WWW-Mechanize/#.##입니다.

+0

'new '에 대한 올바른 매개 변수를'agent'라고하고, 기본 사용자 에이전트 문자열이 – Borodin

+1

인 것을 말하면 좋을 것입니다. @Borodin : 당신 말이 맞습니다. 내 대답에이 정보를 추가했습니다. –

+0

감사합니다. 사이트가'libwww-perl'에 대해 * Forbidden *을 반환하고 WWW-Mechanize에는 반환하지 않는 것이 이상하게 보입니다. 매우 효과적인 코드가 아닌 하드 코딩 된 제외 항목이어야합니다! – Borodin