[python] urllib, urllib2, urllib3과 요청 모듈의 차이점은 무엇입니까?

파이썬에서의 차이 무엇인가 urllib, urllib2, urllib3requests모듈은? 왜 세가 있습니까? 그들은 같은 일을하는 것 같습니다 …



답변

이미 언급되었지만 requestsPython 패키지를 강력히 권장합니다 .

파이썬 이외의 언어를 사용했다면 아마도 생각 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()만 URLLIB에 urllib2가 없습니다.

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

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


답변

urlliburllib2 는 모두 URL 요청 관련 작업을 수행하지만 다른 기능을 제공하는 Python 모듈입니다.

1) urllib2는 URL 요청에 대한 헤더를 설정하기 위해 Request 오브젝트를 승인 할 수 있으며, urllib는 URL 만 승인합니다.

2) urllib는 GET 쿼리 문자열 생성에 사용되는 urlencode 메소드를 제공합니다 . urllib2에는 그러한 기능이 없습니다. 이것이 urllib이 종종 urllib2와 함께 사용되는 이유 중 하나입니다.

Requests -Requests ‘는 Python으로 작성된 간단하고 사용하기 쉬운 HTTP 라이브러리입니다.

1) Python Requests는 매개 변수를 자동으로 인코딩하므로 urllib의 경우와 달리 매개 변수를 전달하기 전에 urllib.encode () 메서드 를 사용하여 매개 변수를 인코딩 해야하는 간단한 인수로 전달하면됩니다.

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

3) 요청은 훨씬 편리한 오류 처리 기능을 제공합니다. 인증에 실패하면 urllib2는 urllib2.URLError를 발생시키는 반면 요청은 예상대로 정상적인 응답 객체를 반환합니다. 부울 응답 으로 요청이 성공했는지 확인해야합니다.


답변

한 가지 중요한 차이점은 Python2를 Python3으로 이식하는 것입니다. urllib2는 python3에 존재하지 않으며 그 메소드는 urllib로 포팅되었습니다. 그래서 당신은 그것을 많이 사용하고 있으며 나중에 파이썬 3으로 마이그레이션하고 싶을 때 urllib을 사용하십시오. 그러나 2to3 도구는 대부분의 작업을 자동으로 수행합니다.


답변

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


답변

나는 그 urllib.urlencode기능을 좋아하는데 에 존재하지 않는 것 같습니다 urllib2.

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


답변

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.

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

  • Python2 urllib.request.urlopen()http.client.HTTPResponse
  • Python3 urllib.urlopen(url)instance
  • 요청 request.get(url)requests.models.Response