문제

파이썬에서 urllib, urllib2, urllib3 그리고 requests 기준 치수? 왜 세 사람이 있습니까? 그들은 같은 일을하는 것 같습니다 ...

도움이 되었습니까?

해결책

나는 그것이 이미 말한 것을 알고 있지만 나는 강력히 추천합니다 requests 파이썬 패키지.

Python 이외의 언어를 사용했다면 아마도 urllib 그리고 urllib2 사용하기 쉽고 코드가 많지 않으며 능력이 뛰어나고 제가 생각했던 방식입니다. 하지만 requests 패키지는 믿을 수 없을 정도로 유용하고 짧아서 모든 사람이 사용해야합니다.

첫째, 완전히 편안한 API를 지원하며 다음과 같이 쉽습니다.

import requests

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

Get / Post에 관계없이 매개 변수를 다시 인코딩 할 필요가 없으며 사전을 인수로 받아들이고 가면 좋습니다.

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

게다가 JSON 디코더가 내장되어 있습니다. json.loads() 글을 쓰는 것이 많지 않지만 편리합니다) :

resp.json()

또는 응답 데이터 만 텍스트 인 경우 다음을 사용합니다.

resp.text

이것은 빙산의 일각 일뿐입니다. 요청 사이트의 기능 목록입니다.

  • 국제 도메인 및 URL
  • 유지 및 연결 풀링을 유지하십시오
  • 쿠키 지속성이있는 세션
  • 브라우저 스타일의 SSL 검증
  • 기본/다이제스트 인증
  • 우아한 키/가치 쿠키
  • 자동 감압
  • 유니 코드 응답 기관
  • 멀티 파트 파일 업로드
  • 연결 시간 초과
  • .NETRC 지원
  • 목록 항목
  • 파이썬 2.6 ~ 3.4
  • 스레드 안전.

다른 팁

urllib2는 몇 가지 추가 기능, 즉 urlopen() 함수는 헤더를 지정할 수 있습니다 (일반적으로 과거에 httplib를 사용해야했는데, 이는 훨씬 더 장점입니다.) 더 중요한 것은 Urllib2가 Request 요청을 수행하는 데보다 선언적 인 접근 방식을 제공하는 클래스 :

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

주목하십시오 urlencode() urllib2가 아닌 urllib에만 있습니다.

URLLIB2에서보다 고급 URL 지원을 구현하기위한 핸들러도 있습니다. 짧은 대답은 레거시 코드로 작업하지 않는 한 urllib2의 URL 오프너를 사용하려는 것이지만 일부 유틸리티 기능에 대해 URLLIB로 가져와야합니다.

보너스 답변Google App Engine을 사용하면 httplib, urllib 또는 urllib2를 사용할 수 있지만 모두 Google의 URL Fetch API를위한 포장지 일뿐입니다. 즉, 포트, 프로토콜 및 허용되는 응답 길이와 같은 동일한 제한 사항이 여전히 적용됩니다. 그러나 HTTP URL을 검색 할 것으로 예상되는 것처럼 라이브러리의 핵심을 사용할 수 있습니다.

urllib 그리고 urllib2 둘 다 URL 요청 관련 작업을 수행하지만 다른 기능을 제공하는 파이썬 모듈입니다.

1) urllib2는 요청 객체를 수락하여 URL 요청에 대한 헤더를 설정할 수 있으며 URLLIB는 URL 만 허용합니다.

2) urllib 제공 urlencode get 쿼리 문자열 생성에 사용되는 방법, urllib2에는 그러한 함수가 없습니다. 이것이 Urllib이 종종 Urllib2와 함께 사용되는 이유 중 하나입니다.

요청 -요청 '은 파이썬으로 작성된 간단하고 사용하기 쉬운 HTTP 라이브러리입니다.

1) Python은 매개 변수를 자동으로 인코딩하므로 방법을 사용해야하는 Urllib의 경우와 달리 간단한 인수로 전달합니다. urllib.encode () 전달하기 전에 매개 변수를 인코딩합니다.

2) 응답을 유니 코드로 자동으로 디코딩했습니다.

3) 요청에는 훨씬 더 편리한 오류 처리가 발생합니다. 인증이 실패하면 urllib2는 urllib2.urlerror를 높이고 요청은 예상대로 일반 응답 객체를 반환합니다. Boolean의 요청이 성공했는지 확인하기 만하면됩니다. 응답 .OO

예를 들어 참조 - https://dancallahan.info/journal/python-requests/

urllib2.urlopen 요청 클래스 또는 URL의 인스턴스를 수락하는 반면 urllib.urlopen은 URL 만 허용합니다.

여기서도 비슷한 토론이 이루어졌습니다.http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-difference.html

나는 좋아한다 urllib.urlencode 기능이 존재하지 않는 것 같습니다 urllib2.

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

하나의 상당한 차이점 중 하나는 Python2를 Python3으로 포팅하는 것입니다. Python3에는 urllib2가 존재하지 않으며 그 방법은 urllib에 포팅되었습니다. 그래서 당신은 그 것을 많이 사용하고 있으며 앞으로 Python3으로 마이그레이션하고 Urllib 사용을 고려하십시오. 그러나 2to3 도구는 대부분의 작업을 자동으로 수행합니다.

기존 답변에 추가하기 위해 Python 요청이 기본 라이브러리가 아니라고 언급 한 사람은 없습니다. 종속성을 추가해도 괜찮다면 요청은 괜찮습니다. 그러나 종속성을 추가하지 않으려는 경우 Urllib은 이미 사용할 수있는 기본 Python 라이브러리입니다.

일반적으로 urllib2를 사용해야합니다. 이는 요청 개체를 수락하여 때때로 상황을 조금 더 쉽게 만들고 프로토콜 오류에 대한 소란을 일으키기 때문입니다. 그래도 Google App Engine을 사용하면 사용할 수 없습니다. 당신은 그것을 사용해야합니다 URL Fetch API Google은 샌드 박스 파이썬 환경에서 제공합니다.

URL의 내용을 얻으려면 :

try: # Try importing requests first.
    import requests
except ImportError: 
    try: # Try importing Python3 urllib
        import urllib.request
    except AttributeError: # Now importing Python2 urllib
        import urllib


def get_content(url):
    try:  # Using requests.
        return requests.get(url).content # Returns requests.models.Response.
    except NameError:  
        try: # Using Python3 urllib.
            with urllib.request.urlopen(index_url) as response:
                return response.read() # Returns http.client.HTTPResponse.
        except AttributeError: # Using Python3 urllib.
            return urllib.urlopen(url).read() # Returns an instance.

Python2와 Python3을 작성하기는 어렵습니다 request 응답에 대한 종속성 코드 urlopen() 기능과 requests.get() 함수 다른 유형을 반환합니다.

  • python2 urllib.request.urlopen() 반환 a http.client.HTTPResponse
  • python3 urllib.urlopen(url) 반환합니다 instance
  • 요구 request.get(url) 반환 a requests.models.Response

위의 답변에서 누락 된 핵심 요점은 urllib이 유형의 객체를 반환한다는 것입니다. <class http.client.HTTPResponse> 반면 requests 보고 <class 'requests.models.Response'>.

이로 인해 read () 메소드를 사용할 수 있습니다. urllib 그러나 그렇지 않습니다 requests.

추신 : requests 이미 너무 많은 방법이 풍부하여 read() ;>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top