Python urllib2 으로 살아있는 유지
-
10-07-2019 - |
문제
할 수 있는 방법을 확인"살아있는 유지하"HTTP 요청을 사용하는 파이썬의 urllib2?
해결책
사용 urlgrabber 도서관. 여기에는 http 1.1 및 keepalive를 지원하는 urllib2 용 HTTP 핸들러가 포함됩니다.
>>> import urllib2
>>> from urlgrabber.keepalive import HTTPHandler
>>> keepalive_handler = HTTPHandler()
>>> opener = urllib2.build_opener(keepalive_handler)
>>> urllib2.install_opener(opener)
>>>
>>> fo = urllib2.urlopen('http://www.python.org')
참고 : UrlGrabber 버전을 사용해야합니다 3.9.0 또는 더 일찍 살아 유지 버전 3.9.1에서 모듈이 제거되었습니다
이있다 포트 keepalive 모듈의 파이썬 3.
다른 팁
노력하다 urllib3 다음과 같은 기능이 있습니다.
- 여러 요청에 대해 동일한 소켓 연결 (HTTPConnectionPool 및 HTTPSConnectionPool)에 대해 재사용하십시오 (선택적인 클라이언트 측 인증서 확인 포함).
- 파일 게시 (encode_multipart_formData).
- 내장 리디렉션 및 검색 (선택 사항).
- GZIP 및 디플레이트 디코딩을 지원합니다.
- 스레드-안전 및 정신-안전.
- 작고 이해하기 쉬운 코드베이스는 확장 및 구축에 적합합니다. 보다 포괄적 인 솔루션의 경우 요청을 살펴보십시오.
또는 훨씬 더 포괄적 인 솔루션 - 요청 - Keep-Alive를 지원합니다 버전 0.8.0 (내부적으로 urllib3를 사용하여). 특징:
- 매우 간단한 헤드, 얻기, 게시, 퍼팅, 패치, 삭제 요청.
- 비동기 요청에 대한 Gevent 지원.
- 쿠키 지속성이있는 세션.
- 기본, 다이제스트 및 사용자 정의 인증 지원.
- 사전의 자동 양식 인코딩
- 요청/응답 쿠키를위한 간단한 사전 인터페이스.
- 멀티 파트 파일 업로드.
- 유니 코드, GZIP 및 디플레이트 응답의 Automatc 디코딩.
- 유니 코드 URL 및 도메인 이름에 대한 완전한 지원.
또는 체크 아웃 httplibhttpconnection.
불행하게도 keepalive.py 에서 제거되었 urlgrabber25Sep2009 년에 의하여 다음과 같이 변경 후에 urlgrabber 변경에 따라 달라집 pycurl(을 지원하는 keep-alive):
http://yum.baseurl.org/gitweb?p=urlgrabber.git;a=commit h=f964aa8bdc52b29a2c137a917c72eecd4c4dda94
그러나,당신은 아직도 얻을 수 있는 마지막 개정 keepalive.py 여기:
Urlgrabber는 Python 2.6에서 완전히 작동하지 않습니다. keepalive.py에서 다음과 같은 수정으로 문제를 해결했습니다.
recopalive.httphandler.do_open ()에서 이것을 제거하십시오
if r.status == 200 or not HANDLE_ERRORS:
return r
그리고 이것을 삽입하십시오
if r.status == 200 or not HANDLE_ERRORS:
# [speedplane] Must return an adinfourl object
resp = urllib2.addinfourl(r, r.msg, req.get_full_url())
resp.code = r.status
resp.msg = r.reason
return resp
집단적 고통과 사용을 피하십시오 요청 대신에. 기본적으로 올바른 작업을 수행하고 해당되는 경우 repoy-alive를 사용합니다.
다음은 SuredSafe가 아니지만 계속 유지하는 다소 유사한 Urlopen ()이 있습니다.
try:
from http.client import HTTPConnection, HTTPSConnection
except ImportError:
from httplib import HTTPConnection, HTTPSConnection
import select
connections = {}
def request(method, url, body=None, headers={}, **kwargs):
scheme, _, host, path = url.split('/', 3)
h = connections.get((scheme, host))
if h and select.select([h.sock], [], [], 0)[0]:
h.close()
h = None
if not h:
Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection
h = connections[(scheme, host)] = Connection(host, **kwargs)
h.request(method, '/' + path, body, headers)
return h.getresponse()
def urlopen(url, data=None, *args, **kwargs):
resp = request('POST' if data else 'GET', url, data, *args, **kwargs)
assert resp.status < 400, (resp.status, resp.reason, resp.read())
return resp