2017-03-18 6 views
1

안녕 유래 커뮤니티를 켤 수없는, 내가 urllib.request 표준 라이브러리에 익숙해 대신 wget과의 작업에서 내 스크립트에서 사용하기 위해 노력하고있어파이썬 3 URLLIB 및 http.client - 디버그 메시지

. 그러나 IDLE이나 스크립트 파일을 사용하지 않거나 commandy를 cmd (py)에 수동으로 입력하지 않으면 자세한 HTTP 메시지를 표시 할 수 없습니다.

필자는 Windows 7 x64에서 Python을 사용하고 있고 3.6.1rc1을 포함하여 3.5 및 3.6을 시도했지만 성공하지 못했습니다. 그래서 여기

http.client.HTTPConnection.debuglevel = 1 

을 내 샘플 코드입니다 :

메시지는 아마도이 명령을 사용하여 설정되어 있습니다. 그것은 작동하지만 세부 사항은 표시되지 않습니다 :

import http.client 
import urllib.request 
http.client.HTTPConnection.debuglevel = 1 
response = urllib.request.urlopen('http://stackoverflow.com') 
content = response.read() 
with open("stack.html", "wb") as file: 
    file.write(content) 

나는 노력했다 (1) 성공하지 .set_debuglevel를 사용하여. 여기에 몇 년 된 질문이있는 것 같습니다 Turning on debug output for python 3 urllib 그러나 이것은 내가 가지고있는 것과 동일하며 작동하지 않습니다. 또한이 질문의 의견 사용자 에 엔 치 Hsuan는이 버그와 버그가 그래서 난이 최근 파이썬 버전에서 해결 기대 년 6 월 2016 년 폐쇄되었다 여기 https://bugs.python.org/issue26892

을보고 말한다.

어쩌면 내가 뭔가를 놓치고 있습니다 (예 : 다른 뭔가를 사용하도록 설정/설치해야 함 등). 그러나 이것에 시간을 할애하여 막 다른 골목에 도달했습니다.

Windows의 Python 3에서 urllib로 http 세부 메시지를 표시하는 효과적인 방법이 있습니까?

당신에게

편집 감사합니다 응답은 PVG하여 간단한 예에 작품을 제안하지만 난 그게 로그인이 필요한 경우에 작업을 할 수 없습니다. HTTPBasicAuthHandler에는이 debuglevel 속성이 없습니다. 그리고 여러개의 핸들러를 하나의 오프너에 결합하려고 시도해도 작동하지 않습니다.

userName = 'mylogin' 
passWord = 'mypassword' 
top_level_url = 'http://page-to-login.com' 

# create an authorization handler 
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, top_level_url, userName, passWord); 

auth_handler = urllib.request.HTTPBasicAuthHandler(passman) 
opener = urllib.request.build_opener(auth_handler) 
urllib.request.install_opener(opener) 

result = opener.open(top_level_url) 
content = result.read() 
+0

정확히 어떤 버그 또는 단지를위한 테스트 케이스에 있어요 urllib3로 전환하고'urllib3.add_stderr_logger()'를 사용하십시오. – pvg

답변

0

당신이 연결 문제의 예는 작업 코드를 보여줍니다, 버전은 아래의 재현 :

이 꽤 투박
import urllib.request 

handler = urllib.request.HTTPHandler(debuglevel=10) 
opener = urllib.request.build_opener(handler) 
content = opener.open('http://stackoverflow.com').read() 

print(content[0:120]) 

가, 또 다른 옵션은 urllib3 (http://urllib3.readthedocs.io/en/latest/) 같은 친근 라이브러리를 사용하는 것입니다. 대신 요청 라이브러리를 사용하기로 결정한 경우

import urllib3 

urllib3.add_stderr_logger() 
http = urllib3.PoolManager() 
r = http.request('GET', 'http://stackoverflow.com') 
print(r.status) 

는 다음과 같은 대답은 로깅을 설정하는 방법에 대해 설명합니다 :

How can I see the entire HTTP request that's being sent by my Python application?

당신은 복사를 시도 할 수 있습니다
+0

감사합니다! 필자가 제공 한 기본 예제는 제대로 작동하지만 HTTPBasicAuthHandler와 결합하여 로그인이 필요한 페이지에 액세스 할 때 디버그 레벨을 설정할 수 없습니다.그래서 디버그 레벨을 http 요청에 대해 "글로벌"로 바꾸는 방법을 원했던 예제가 표시되기를 바랬습니다./ – alleby

+0

이 주석이 수용 가능한 대답인지 또는 질문에 다른 요구 사항이 있는지 확실하지 않습니다. 후자 인 경우 질문을 업데이트하여 설명하십시오. – pvg

+0

안녕하세요, 네가 내 질문에 대답했지만 방법은 항상 작동하지 않습니다. 나는 제안 된대로 나의 질문을 편집했다. 필요한 경우 새로운 질문을 열고이 질문을 닫을 수 있습니다. Thx – alleby