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


750

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


77
요청 이 최고입니다.
Yarin

2
예, 요청을 사용하십시오. stackoverflow.com/questions/22676/…
hughdbrown

75
요청은 urllib3을 사용합니다. 3은 더 큰 숫자입니다
Bro

2
요약 : requests대부분의 시간을 사용하십시오. 때로는 urllib2작동하지만 더 많은 코드가 필요하고 덜 우아합니다. 를 사용하지 마십시오 urllib.
Trevor Boyd Smith

10
이 질문은 urllib파이썬 3에서 다양한 방법으로 정리 된 또 다른 옵션 임을 명확히하기 위해 업데이트되어야합니다 . 그러나 공식 문서에 따르면 21.6 에서 " 요청 패키지는 더 높은 수준의 HTTP 클라이언트 인터페이스에 권장됩니다. "라고 말합니다 . urllib.request — URL을 열기위한 확장 가능한 라이브러리 — Python 3.6.3 documentation
nealmcb

답변:


714

이미 언급되었지만 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
  • 스레드 안전.

32
원래 답변이 오래 되었기 때문에 이것을 답변으로 선택했습니다. 따라서이 답변이 76 개의 upvotes로 답변보다 앞서있는 이유가 궁금한 경우 요청이 작업을 수행하는 새로운 사실상의 방법이기 때문입니다.
Paul Biggar

132
@PaulBiggar 당신은 이것이 최선의 대답이라고 말합니다. 그러나 실제로 질문에 대답하지는 않습니다. urllib과 urllib2의 차이점에 대해 여기에 왔습니다. 특히 URL 인코딩 기능에 대해. 답 : 사용 요청! ;) 단지 당신이 질문을 명확히하고 싶을 수도 있습니다. Crast의 답변은 실제로 질문에 완벽하게 답변합니다.
exhuma

2
파이썬 3 문서에는 또 다른 별개의 라이브러리 urllib가 있으며 그 문서에는 공식적으로 " 요청 패키지가 더 높은 수준의 HTTP 클라이언트 인터페이스에 권장됩니다. "( 21.6)가 언급되어 있습니다. 오프닝 URL에 대한 확장 라이브러리 - - urllib.request 파이썬 3.6.3 문서 , 그것은 urllib3사용하는 좋은 라이브러리입니다 requests.
nealmcb

노출 요청이 대체품이 아님을 제외하고는 괜찮 습니다urllib.parse()
Bob Stein

동의하다. @PaulBiggar-요청은 사실상의 방식으로 보입니다. 사실 나는 urllib (및 다른 버전)이 작동하지 않거나 요청과 비교하여 차선책에 근거하여 여기에 도착했습니다.
DL

205

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을 검색 할 것으로 예상되는대로 라이브러리의 핵심을 사용할 수 있습니다.


1
urllib2를 사용하여 인코딩 된 쿼리 문자열로 URL을 작성하는 사람은 무엇입니까? urllib을 사용하는 유일한 이유이며 모든 것을 최신 / 가장 좋은 방법으로 수행하고 싶습니다.
Gattster

2
내 위의 예에서와 같이, 당신은 사용 urlopen()Request에서 urllib2가 , 당신은 사용 urlencode()에서 URLLIB . 올바른 urlopen을 사용하기 만하면 두 라이브러리를 모두 사용할 때 실질적인 해를 끼치 지 않습니다. [urllib docs] [1]는 이것을 사용하는 것이 용납되었다는 것을 분명히합니다. [1] : docs.python.org/library/urllib2.html#urllib2.urlopen
Crast

나는 요지를 사용 했다 urllib2.urlopen; 다른 변형도 포함되어 있습니다.
Andrei-Niculae Petre 2016 년

urllib2는 고통
스러운

1
requests또한 사용자 정의 헤더를 허용합니다 : docs.python-requests.org/en/master/user/quickstart/…
Omer Dagan

46

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를 발생시키는 반면 요청은 예상대로 정상적인 응답 객체를 반환합니다. 부울 응답 으로 요청이 성공했는지 확인해야합니다.


10
urllib3은 어떻습니까?
PirateApp

1
@PirateApp의 요청은 위에 구축 urllib3 . urllib3을 직접 사용하는 코드는 세션을 재사용 할 수 있기 때문에 더 효율적일 수 있다고 생각하지만 요청 (모든 사람이 사용하는 요청 2 이상)은 모든 요청에 ​​대해 하나를 생성하지만 그에 대해 인용하지는 않습니다. 표준 라이브러리의 일부도
Boris

12

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


12

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


11

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

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

4
참고로, <unicode> 객체를 직접 처리 할 수 ​​없으므로 urlencode에주의하십시오.이를 urlencode (u'blá'.encode ( 'utf-8') 또는 기타)로 보내기 전에 인코딩해야합니다.

@ user18015 : 이것이 Python 3에 적용되지 않는다고 생각합니다. 명백 할 수 있습니까?
야누스 트롤 슨

위에서 언급 했듯이이 질문과 다양한 답변은 urllibPython 3에서 다양한 방법으로 정리 된 또 다른 옵션 임을 명확히하기 위해 업데이트해야합니다 . 그러나 공식 문서에 따르면 21.6 에서 " 요청 패키지는 상위 레벨 HTTP 클라이언트 인터페이스에 권장됩니다. "라고 말합니다 . urllib.request — URL을 열기위한 확장 가능한 라이브러리 — Python 3.6.3 documentation
nealmcb

urllib2는 파이썬 3에 전혀 존재하지 않습니다
Boris

7

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

5

일반적으로 urllib2를 사용해야합니다. 이렇게하면 Request 객체를 수락하여 시간이 조금 더 쉬워지고 프로토콜 오류에 대한 URLException도 발생합니다. 그러나 Google App Engine을 사용하면 둘 다 사용할 수 없습니다. 샌드 박스형 Python 환경에서 Google이 제공 하는 URL Fetch API 를 사용해야 합니다.


2
appengine에 대해 말한 것은 전적으로 사실이 아닙니다. 실제로 App Engine에서 httplib, urllib 및 urllib2를 사용할 수 있습니다 (더 많은 코드가 appengine과 호환되도록 URL 가져 오기를위한 래퍼입니다)
Crast

아, 새로 워야합니다. 내 코드는 마지막으로 실패하고 가져 오기 작업을 위해 다시 작성해야했습니다 ...
Chinmay Kanchi


urllib2는 파이썬 3에 전혀 존재하지 않습니다
Boris

@Boris urllib.requesturllib.error 로 마이그레이션되었습니다 .
Alan

1

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

이로 인해 read () 메소드는 사용할 수 있지만 사용할 수는 urllib없습니다 requests.

추신 : requests이미 많은 방법이 풍부하여 더 이상 거의 필요하지 않습니다 read().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.