2012-06-07 3 views
8

다른 문자열 :`open_http '403 금지 (OpenURI :: HTTPError) 문자열 "Steve_Jobs"에 대한하지만 내가 <a href="http://ruby.bastardsbook.com/">http://ruby.bastardsbook.com/</a>에서 제공하는 루비 튜토리얼을 통해가는 나는 다음과 같은 코드가 발생

require "open-uri" 

remote_base_url = "http://en.wikipedia.org/wiki" 
r1 = "Steve_Wozniak" 
r2 = "Steve_Jobs" 
f1 = "my_copy_of-" + r1 + ".html" 
f2 = "my_copy_of-" + r2 + ".html" 

# read the first url 
remote_full_url = remote_base_url + "/" + r1 
rpage = open(remote_full_url).read 

# write the first file to disk 
file = open(f1, "w") 
file.write(rpage) 
file.close 

# read the first url 
remote_full_url = remote_base_url + "/" + r2 
rpage = open(remote_full_url).read 

# write the second file to disk 
file = open(f2, "w") 
file.write(rpage) 
file.close 

# open a new file: 
compiled_file = open("apple-guys.html", "w") 

# reopen the first and second files again 
k1 = open(f1, "r") 
k2 = open(f2, "r") 

compiled_file.write(k1.read) 
compiled_file.write(k2.read) 

k1.close 
k2.close 
compiled_file.close 

코드는 다음 추적에 실패

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 403 Forbidden (OpenURI::HTTPError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
    from /Users/arkidmitra/tweetfetch/samecode.rb:11 

내 문제는 코드가 실패 할 것이 아니라 내가 Steve_Jobs 이외의 다른 R2를 변경할 때마다, 그것을 작동합니다. 여기서 무슨 일이 일어나고있는거야?

+0

에서 나중에 지정은 필터링 URL을 수 있습니다 프록시 또는 뭔가있어? 동일한 컴퓨터에서 다른 URL을 통해 '나쁜'URL을 누르려고 했습니까? 예 : lynx 브라우저? –

+0

그런 것은 없습니다. wget "http://en.wikipedia.org/wiki/Steve_Jobs"에서도 작동합니다. 나는 놀랍다. –

+1

사용자 에이전트를'open (remote_full_url, "User-Agent"=> "Mozilla/5.0 (Windows NT 6.0; rv : 12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1")'과 같이 설정해 볼 수 있습니까? 너의 편이야? – vstm

답변

2

나는이 "스티브 잡스"와 같은 잠겨 항목에 대해 어떻게 생각 등 이것은 당신이 언급하는 같은 책에 지정된 "알 - 고어"일부 페이지

- 같은 Al Gore의 잠긴 항목 - 위키 백과는 사용자 에이전트가 지정되지 않은 경우 웹 요청에 응답하지 않습니다. "User-Agent"는 일반적으로 브라우저를 나타내며 브라우저에서 페이지 요청에 대해 보낸 헤더를 검사하여 으로 확인할 수 있습니다. "User-Agent"키 - 값 쌍 (기본적으로 "Ruby" 을 사용하고 작동하는 것처럼 보임)을 사용하여 해시로 전달할 수 있습니다 (예 : HEADERS_HASH). 메소드 호출의 인수.

그것은 http://ruby.bastardsbook.com/chapters/web-crawling/

9

존재하는 위키 페이지를 요청하면 코드가 잘 실행됩니다 (Ruby MRI 1.9.3).

존재하지 않는 위키 페이지를 요청하면 mediawiki 404 오류 코드가 표시됩니다.

  • Steve_Jobs => 성공
  • Steve_Austin => 성공
  • Steve_Rogers => 성공
  • 오류

위키 백과는 t 캐싱의, 당신이 볼 그래서 만약을 수행 Steve_Foo => 존재하는 다른 사람들과 다른 "Steve_Jobs"에 대한 Reponses를 사용하면 Steve Jobs의 유명한 기사이기 때문에 위키 피 디아가 Steve Jobs 기사를 캐싱하기 때문에 이것이 가장 좋습니다. 급격한 변화, 훼손 등으로부터 기사를 보호하기 위해 추가 검사/확인을 수행 할 수 있습니다.

해결 방법 : 항상 사용자 에이전트 문자열로 URL을 엽니 다. 미디어 위키 문서에서

rpage = open(remote_full_url, "User-Agent" => "Whatever you want here").read 

세부 사항 : 당신은 미디어 위키 웹 서비스 API에 HTTP 요청을하면 "제대로 클라이언트를 식별하는 사용자 에이전트 헤더를 지정해야합니다 기본 사용자 에이전트를 사용하지 마십시오. 클라이언트 라이브러리에서 제공하지만 클라이언트의 이름과 버전 번호가 포함 된 사용자 정의 헤더를 구성하십시오 (예 : "MyCuteBot/0.1").

위키피디아 위키에서는 사용자 에이전트를 제공하지 않으면 헤더를 사용하거나 비어 있거나 일반 메시지를 제공하면 HTTP 403 오류로 요청이 실패합니다. 사용자 - 에이전트 정책을 참조하십시오. "

+0

따라서 다른 이름에 대한 초기 테스트가 브라우저를 통해 이루어졌고 캐시 된 결과가 표시됩니다. "Steve_Jobs"를 누르면 캐시되지 않으며 UA 문자열을 사용하지 않으므로 403을 얻었습니다. –

+0

이것을 일관되게 컬링으로 재현 할 수 있습니다. 작업 페이지는 403 w/o UA를 반환합니다. UA가 제공되면 정상 200 응답을 반환합니다. 몇 가지 다른 페이지를 시도했지만 아무도이 동작을했다. 기묘한... – alienhard