Urllib, urllib2, urllib3 ve istek modülü arasındaki farklar nelerdir?


750

Python'da, arasındaki farklar nelerdir urllib, urllib2, urllib3ve requestsmodüllerin? Neden üç tane var? Aynı şeyi yapıyor gibi görünüyorlar ...


77
İstekler en iyisidir.
Yarin


75
istekleri urllib3 kullanır. 3 daha büyük bir sayıdır
Bro

2
özet: requestsçoğu zaman kullanın . bazen urllib2çalışır ancak daha fazla kod gerektirir ve daha az zariftir. kullanma urllib.
Trevor Boyd Smith

10
Bu soru urllib, Python 3'te çeşitli yollarla temizlenmiş başka bir seçenek olduğunu açıklığa kavuşturmak için güncellenmelidir . Ama neyse ki aynı zamanda resmi belgeler "olduğu notlar İstekleri paket daha üst düzey HTTP istemci arabirimi için tavsiye edilir. " Nde 21,6. urllib.request - URL'leri açmak için genişletilebilir kitaplık - Python 3.6.3 belgeleri
nealmcb

Yanıtlar:


714

Zaten söylendiğini biliyorum, ama requestsPython paketini şiddetle tavsiye ediyorum .

Python'dan başka diller kullandıysanız, muhtemelen düşünürsünüz urllibve urllib2kullanımı kolaydır, fazla kod değil ve son derece yetenekli, bu şekilde düşünürdüm. Ancak requestspaket o kadar inanılmaz kullanışlı ve kısa ki, herkes onu kullanmalı.

İlk olarak, tamamen dinlendirici bir API'yi destekler ve aşağıdaki kadar kolaydır:

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 olsun, parametreleri bir daha asla kodlamanız gerekmez, bir sözlüğü bağımsız değişken olarak alır ve gitmek iyidir:

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

Artı, yerleşik bir JSON dekoderi bile var (yine, json.loads()yazmak için daha fazla bir şey olmadığını biliyorum , ancak bu kesinlikle uygun):

resp.json()

Veya yanıt verileriniz yalnızca metinse şunu kullanın:

resp.text

Bu buzdağının sadece görünen kısmı. İstek sitesindeki özelliklerin listesi:

  • Uluslararası Alan Adları ve URL'ler
  • Hayatta Kalma ve Bağlantı Havuzu Oluşturma
  • Çerez Kalıcılığı Olan Oturumlar
  • Tarayıcı tarzı SSL Doğrulaması
  • Temel / Özet Kimlik Doğrulaması
  • Zarif Anahtar / Değerli Çerezler
  • Otomatik Dekompresyon
  • Unicode Müdahale Organları
  • Çok Parçalı Dosya Yüklemeleri
  • Bağlantı Zaman Aşımları
  • .netrc desteği
  • Liste öğesi
  • Python 2.6—3.4
  • Konu güvenli.

32
Bunu cevap olarak seçtim çünkü orijinal cevap bayat oldu. Bu cevabın neden 76 upvotes ile bir cevabın önünde olduğunu merak ediyorsanız, çünkü İstekler bir şeyler yapmanın yeni kusurlu yoludur.
Paul Biggar

132
@PaulBiggar, bunun en iyi cevap olduğunu söylüyorsun. Ama soruya gerçekten cevap vermiyor. Buraya urllib ve urllib2 arasındaki farkları öğrenmek için geldim. Özellikle url kodlama özellikleri hakkında. Cevap: istekleri kullanın! ;) Sadece soruyu netleştirmek isteyebilirsiniz. Durduğu gibi, Crast'ın cevabı aslında soruyu mükemmel bir şekilde cevaplıyor.
exhuma

2
Bu Python 3 dokümantasyon da farklıdır kütüphaneye sahiptir o notta yardımcı olacaktır urllib"diye de resmen notlar ve belgeler bu istekler paketi daha üst düzey HTTP istemci arabirimi için tavsiye edilir. " Nde 21,6. urllib.request - URL'leri açmak için genişletilebilir kitaplık - Python 3.6.3 belgeleri ve bu urllib3tarafından kullanılan harika bir kitaplıktır requests.
nealmcb

Tamam ben izlenim var hariç istek hiçbir değiştirme vardır içinurllib.parse()
Bob Stein

Katılıyorum. @PaulBiggar ile - istekler fiili yol gibi görünüyor. Aslında buraya urllib (ve diğer sürümler) ya çalışmaz ya da isteklere göre yetersiz olduğu temelinde geldi.
DL

205

urllib2 bazı ekstra işlevsellik sağlar, yani urlopen()işlev üstbilgileri belirtmenize izin verebilir (normalde geçmişte httplib kullanmak zorunda kalacaksınız, ki bu çok daha ayrıntılıdır.) Daha da önemlisi, urllib2 Requestdaha fazla olanak sağlayan sınıfı sağlar bir talepte bulunmak için deklaratif yaklaşım:

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

Unutmayın ki urlencode()sadece urllib, urllib2 değil.

Ayrıca urllib2'de daha gelişmiş URL desteği uygulamak için işleyiciler de vardır. Kısa yanıt, eski kodla çalışmadığınız sürece, urllib2'deki URL açıcıyı kullanmak isteyeceksinizdir, ancak yine de bazı yardımcı işlevler için urllib'e aktarmanız gerekir.

Bonus cevap Google App Engine ile httplib, urllib veya urllib2'den herhangi birini kullanabilirsiniz, ancak bunların tümü yalnızca Google'ın URL Getirme API'sı için sarıcıdır. Yani, bağlantı noktaları, protokoller ve izin verilen yanıtın uzunluğu gibi aynı sınırlamalara tabi olursunuz. Bununla birlikte, kütüphanelerin çekirdeğini HTTP URL'lerini almayı beklediğiniz gibi kullanabilirsiniz.


1
Birisi urllib2 kullanarak kodlanmış bir sorgu dizesiyle URL'yi nasıl oluşturur? Urllib kullanmamın tek nedeni ve her şeyi en son / en iyi şekilde yaptığımdan emin olmak istiyorum.
Gattster

2
Benim yukarıdaki örnekte olduğu gibi, kullandığınız urlopen()ve Requestgelen urllib2 ve kullandığınız urlencode()gelen urllib . Doğru urlopen kullandığınızdan emin olduğunuz sürece her iki kütüphaneyi de kullanmanın gerçek bir zararı yoktur. [Urllib dokümanları] [1] bunu kullanmanın kabul edilen kullanım olduğu konusunda açıktır. [1]: docs.python.org/library/urllib2.html#urllib2.urlopen
Crast

Kullandığım bu için özünü urllib2.urlopen; başka varyasyonlar da içerir.
Andrei-Niculae Petre

urllib2 bir ağrı olduğunu koymak veya silmek desteklemiyor
fkl

1
requestsayrıca özel başlıklara da izin ver
Omer Dagan

46

urllib ve urllib2 , URL isteğiyle ilgili şeyler yapan ancak farklı işlevler sunan Python modülleridir.

1) urllib2, bir URL isteğinin üstbilgilerini ayarlamak için bir Request nesnesini kabul edebilir, urllib yalnızca bir URL'yi kabul eder.

2) urllib, GET sorgu dizelerinin oluşturulması için kullanılan urlencode yöntemini sağlar, urllib2'nin böyle bir işlevi yoktur. Urllib'in urllib2 ile birlikte sıklıkla kullanılmasının nedenlerinden biri de budur.

İstekler - İstekler 'Python ile yazılmış basit, kullanımı kolay bir HTTP kütüphanesidir.

1) Python İstekleri parametreleri otomatik olarak kodlar, böylece parametreleri geçirmeden önce kodlamak için urllib.encode () yöntemini kullanmanız gereken urllib örneğinden farklı olarak basit argümanlar olarak iletirsiniz .

2) Yanıtın otomatik olarak Unicode'a deşifre edilmesi.

3) İsteklerde ayrıca çok daha uygun hata işleme vardır. Kimlik doğrulamanız başarısız olursa, urllib2 bir urllib2.URLError değerini yükseltirken, İstekler beklendiği gibi normal bir yanıt nesnesi döndürür. Tek yapmanız gereken, isteğin boolean response.ok tarafından başarılı olup olmadığını görmek.


10
urllib3 ne olacak?
PirateApp

1
@PirateApp istekleri üzerine kuruludur urllib3 . Ben doğrudan urllib3 kullanarak kod daha verimli olabileceğini düşünüyorum, çünkü istekleri (en az istekleri 2, herkes kullandığı) her isteği için bir tane oluşturur, ancak bana bu konuda teklif yok. Hiçbiri standart kütüphanenin bir parçası değil ( henüz )
Boris

12

Önemli bir fark, Python2'yi Python3'e taşımakla ilgilidir. urllib2, python3 ve urllib'e taşınan yöntemleri için mevcut değildir. Yani bunu yoğun olarak kullanıyorsunuz ve gelecekte Python3'e geçmek istiyorsanız urllib kullanmayı düşünün. Ancak 2to3 aracı işin çoğunu sizin için otomatik olarak yapacaktır.


12

Sadece mevcut cevaplara eklemek için, python isteklerinin yerel bir kütüphane olmadığını belirten kimseyi görmüyorum. Bağımlılık ekleme konusunda sorun yaşıyorsanız, istekler iyidir. Ancak, bağımlılık eklemekten kaçınmaya çalışıyorsanız, urllib zaten kullanabileceğiniz yerel bir python kütüphanesidir.


11

Ben urllib.urlencodefonksiyonu seviyorum ve var gibi görünmüyor urllib2.

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

4
Sadece bir not, <unicode> nesnelerini doğrudan işleyemediği için urlencode'a dikkat edin - bunları urlencode'a (u'blá'.encode ('utf-8') veya her neyse) göndermeden önce kodlamanız gerekir.

@ user18015: Bunun Python 3 için geçerli olduğunu düşünmüyorum, netleştirebilir misiniz?
Janus Troelsen

Yukarıda belirttiğim gibi, bu soru ve çeşitli cevaplar urllib, Python 3'te çeşitli yollarla temizlenmiş başka bir seçenek olduğunu açıklığa kavuşturmak için güncellenmelidir . Ama neyse ki, "bu da resmi belgeler notları İstekler paket daha üst düzey HTTP istemci arayüzüne. Önerilmektedir de" 21,6. urllib.request - URL'leri açmak için genişletilebilir kitaplık - Python 3.6.3 belgeleri
nealmcb

urllib2 Python 3'te hiç mevcut değil
Boris

7

Bir URL'nin içeriğini almak için:

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.

İşlevler ve işlevler farklı türler döndürdüğünden request, yanıtlar için Python2 ve Python3 ve bağımlılık kodu yazmak zordur :urlopen()requests.get()

  • Python2 urllib.request.urlopen()birhttp.client.HTTPResponse
  • Python3 urllib.urlopen(url)birinstance
  • İstek request.get(url)birrequests.models.Response

5

Genellikle urllib2 kullanmalısınız, çünkü bu, Request nesnelerini kabul ederek işleri biraz kolaylaştırır ve ayrıca protokol hataları üzerinde bir URLException oluşturur. Yine de Google App Engine ile ikisini de kullanamazsınız. Google'ın korumalı alanlı Python ortamında sağladığı URL Getirme API'sını kullanmanız gerekir .


2
Appengine hakkında söyledikleriniz tamamen doğru değil. Aslında (onlar url için sarmalayıcıları daha kod AppEngine'de uyumlu olacak şekilde yapılır, getirme bulunmaktadır.) Artık App Engine httplib, urllib ve urllib2 kullanabilirsiniz
Crast

Ah, yeni olmalı. Son denedim ve getirme ile çalışmak için yeniden yazılmak zorunda kodum başarısız oldu ...
Chinmay Kanchi


urllib2 Python 3'te hiç mevcut değil
Boris


1

Yukarıda yanıtlarda eksik bulmak önemli bir nokta bu urllib döner tipte bir amacı <class http.client.HTTPResponse>ise requestsgeri dönüş <class 'requests.models.Response'>.

Bu nedenle, read () yöntemi ile birlikte kullanılabilir urllibancak birlikte kullanılamaz requests.

Not: requestsZaten pek çok yöntemle zengindir read();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.