2012-06-06 3 views
2

파이썬 (파이썬 3.2를 사용하지만 파이썬 2.x에서는 거의 같아야합니다)에서 특정 URL에 대한 요청을 시도합니다. 액세스 거부로 오류의 경우 오류가 발생해도 HTTPResponse를 검색하십시오.

는, 나는 예외가 얻을 :

>>> request = urllib.request.urlopen(myurl) 
... 
    File "/usr/lib/python3.2/urllib/request.py", line 495, in http_error_default 
    raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 401: Unauthorized 

을하지만 난 오류의 경우에는 요청의 헤더를보고 싶습니다.

>>> request = urllib.request.urlopen(myurl) 
>>> print(request.status) 
401 
>>> print(request.headers) 
... 

는 또한 페이지가 리디렉션 상태 코드 등 (301)로 응답 할 때, 내가 얻을 응답이 리디렉션 페이지,하지 (내가 원하는 하나입니다) 첫 번째 인 것으로 나타났습니다.

어떻게 할 수 있습니까?

답변

4

요청 패키지 사용을 고려해 보셨습니까? 그것은 당신에게 당신의 요청을 수행하기 위해 만든 모든 리디렉션의 역사를 제공합니다

>>> import requests 
>>> r = requests.get('http://google.com') 
>>> r 
<Response [200]> 
>>> r.history 
[<Response [301]>, <Response [302]>] 
>>> r.url 
u'http://www.google.co.uk/' 

을 그리고 그것은 또한 401 오류

>>> r = requests.get('http://sitesurgeon.co.uk/!dev/http-authorisation/staff/index.htm') 
>>> r 
<Response [401]> 
>>> r.content 
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> ... 
....' 
>>> r.headers 
{'date': 'Wed, 06 Jun 2012 14:24:16 GMT', 'x-powered-by': 'PHP/5.3.13', 'transfer-encoding': 'chunked', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'Basic realm="Staff Area"', 'server': 'Apache'} 

당신이 당신의 시간 제한이 단순히 요청을 제어하려면

에 올바로 수행 거래 다음과 같습니다 :

requests.get('http://google.com', timeout=0.1) 
+0

내가 좋아하는 것 같습니다. 수락하기 전에 호스트가 다운되었거나 존재하지 않을 때 호스트가이를 수행 할 수있는 방법을 알고 있습니까? 'r = requests.get ('http : //google.comm')'은 충돌하기 전에 오랜 시간이 걸립니다. –

+1

요청 패키지와 같은 치어 리더가되어서 죄송합니다 ...하지만 정말 사용하는 것이 훨씬 더 좋네요. 나이를 위해 urllib2를 사용했다. 그러나 5 분 동안 요청을 사용하고 난 후에 내가 좋아 졌던 것처럼 느꼈다. –

+1

물론 ... ... timeout 옵션을 사용하면 –

관련 문제