Dalam Python, apa perbedaan antara urllib
, urllib2
, urllib3
dan requests
modul? Kenapa ada tiga? Mereka tampaknya melakukan hal yang sama ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
sumber
sumber
requests
sebagian besar waktu. terkadangurllib2
bekerja tetapi membutuhkan lebih banyak kode dan kurang elegan. jangan gunakanurllib
.urllib
dalam Python 3 adalah pilihan lain, dibersihkan dengan berbagai cara. Namun syukurlah dokumentasi resmi juga mencatat bahwa " Paket Permintaan direkomendasikan untuk antarmuka klien HTTP tingkat tinggi. " Di 21,6. urllib.request - Pustaka yang bisa diperluas untuk membuka URL - Dokumentasi Python 3.6.3Jawaban:
Saya tahu itu sudah dikatakan, tapi saya sangat merekomendasikan
requests
paket Python.Jika Anda menggunakan bahasa selain python, Anda mungkin berpikir
urllib
danurllib2
mudah digunakan, tidak banyak kode, dan sangat cakap, begitulah cara saya berpikir. Tetapirequests
paket ini sangat berguna dan singkat sehingga setiap orang harus menggunakannya.Pertama, mendukung API yang sepenuhnya tenang, dan semudah:
Terlepas dari apakah GET / POST, Anda tidak perlu menyandikan parameter lagi, itu hanya membutuhkan kamus sebagai argumen dan baik untuk pergi:
Plus itu bahkan memiliki decoder JSON bawaan (sekali lagi, saya tahu
json.loads()
tidak banyak lagi yang bisa ditulis, tapi ini pasti nyaman):Atau jika data respons Anda hanya berupa teks, gunakan:
Ini hanya puncak gunung es. Ini adalah daftar fitur dari situs permintaan:
sumber
urllib
dan bahwa dokumentasinya juga secara resmi mencatat bahwa " Paket Permintaan direkomendasikan untuk antarmuka klien HTTP tingkat tinggi. " Di 21.6. urllib.request - Pustaka yang dapat diperluas untuk membuka URL - dokumentasi Python 3.6.3 , dan ituurllib3
adalah pustaka hebat yang digunakan olehrequests
.urllib.parse()
urllib2 menyediakan beberapa fungsionalitas tambahan, yaitu
urlopen()
fungsi ini memungkinkan Anda untuk menentukan header (biasanya Anda harus menggunakan httplib di masa lalu, yang jauh lebih bertele-tele.) Lebih penting lagi, urllib2 menyediakanRequest
kelas, yang memungkinkan untuk lebih pendekatan deklaratif untuk melakukan permintaan:Perhatikan bahwa
urlencode()
hanya di urllib, bukan urllib2.Ada juga penangan untuk mengimplementasikan dukungan URL yang lebih canggih di urllib2. Jawaban singkatnya adalah, kecuali Anda bekerja dengan kode lawas, Anda mungkin ingin menggunakan pembuka URL dari urllib2, tetapi Anda masih perlu mengimpor ke urllib untuk beberapa fungsi utilitas.
Jawaban bonus Dengan Google App Engine, Anda dapat menggunakan httplib, urllib, atau urllib2, tetapi semuanya hanyalah pembungkus untuk Google URL Fetch API. Artinya, Anda masih tunduk pada batasan yang sama seperti port, protokol, dan panjang respons yang diizinkan. Anda dapat menggunakan inti dari perpustakaan seperti yang Anda harapkan untuk mengambil URL HTTP.
sumber
urlopen()
danRequest
dari urllib2 , dan Anda menggunakanurlencode()
dari urllib . Tidak ada salahnya menggunakan kedua pustaka, selama Anda memastikan Anda menggunakan urlopen yang benar. The [urllib docs] [1] jelas tentang penggunaan ini adalah penggunaan yang diterima. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; mengandung variasi lain juga.requests
juga membolehkan tajuk khusus: docs.python-requests.org/en/master/user/quickstart/…urllib dan urllib2 adalah modul Python yang melakukan hal-hal terkait permintaan URL tetapi menawarkan fungsionalitas yang berbeda.
1) urllib2 dapat menerima objek Permintaan untuk mengatur tajuk untuk permintaan URL, urllib hanya menerima URL.
2) urllib menyediakan metode urlencode yang digunakan untuk menghasilkan string kueri GET, urllib2 tidak memiliki fungsi seperti itu. Ini adalah salah satu alasan mengapa urllib sering digunakan bersama dengan urllib2.
Permintaan - Permintaan 'adalah perpustakaan HTTP sederhana dan mudah digunakan yang ditulis dengan Python.
1) Permintaan Python mengkodekan parameter secara otomatis sehingga Anda hanya memberikannya sebagai argumen sederhana, tidak seperti pada urllib, di mana Anda perlu menggunakan metode urllib.encode () untuk menyandikan parameter sebelum meneruskannya.
2) Secara otomatis menerjemahkan respons ke Unicode.
3) Permintaan juga memiliki penanganan kesalahan yang jauh lebih mudah. Jika otentikasi Anda gagal, urllib2 akan meningkatkan urllib2.URLError, sementara Permintaan akan mengembalikan objek respons normal, seperti yang diharapkan. Yang harus Anda lihat jika permintaan berhasil oleh boolean response.ok
sumber
Satu perbedaan besar adalah tentang porting Python2 ke Python3. urllib2 tidak ada untuk python3 dan metodenya porting ke urllib. Jadi Anda menggunakan itu banyak dan ingin bermigrasi ke Python3 di masa depan, pertimbangkan untuk menggunakan urllib. Namun alat 2to3 secara otomatis akan melakukan sebagian besar pekerjaan untuk Anda.
sumber
Hanya untuk menambah jawaban yang ada, saya tidak melihat ada yang menyebutkan bahwa permintaan python bukan perpustakaan asli. Jika Anda setuju dengan menambahkan dependensi, maka permintaan baik-baik saja. Namun, jika Anda berusaha menghindari penambahan dependensi, urllib adalah pustaka python asli yang sudah tersedia untuk Anda.
sumber
Saya suka
urllib.urlencode
fungsinya, dan sepertinya tidak ada diurllib2
.sumber
urllib
dengan Python 3 adalah pilihan lain, dibersihkan dengan berbagai cara. Namun syukurlah, dokumentasi resmi juga mencatat bahwa " Paket Permintaan direkomendasikan untuk antarmuka klien HTTP tingkat tinggi. " Di 21,6. urllib.request - Pustaka yang dapat diperluas untuk membuka URL - Dokumentasi Python 3.6.3Untuk mendapatkan konten dari url:
Sulit untuk menulis Python2 dan Python3 dan
request
kode dependensi untuk respons karena merekaurlopen()
berfungsi danrequests.get()
mengembalikan tipe yang berbeda:urllib.request.urlopen()
mengembalikan ahttp.client.HTTPResponse
urllib.urlopen(url)
mengembalikan sebuahinstance
request.get(url)
pengembalian arequests.models.Response
sumber
Anda biasanya harus menggunakan urllib2, karena ini kadang-kadang membuat hal-hal sedikit lebih mudah dengan menerima objek Permintaan dan juga akan meningkatkan URLException pada kesalahan protokol. Dengan Google App Engine, Anda tidak dapat menggunakan keduanya. Anda harus menggunakan URL Ambil API yang Google sediakan di lingkungan Python yang berpasir.
sumber
Poin kunci yang saya temukan hilang dalam jawaban di atas adalah bahwa urllib mengembalikan objek bertipe
<class http.client.HTTPResponse>
sedangkanrequests
mengembalikan<class 'requests.models.Response'>
.Karena itu, metode read () dapat digunakan dengan
urllib
tetapi tidak denganrequests
.PS:
requests
sudah kaya dengan begitu banyak metode sehingga tidak perlu satu lagi sepertiread()
;>sumber