Saya memiliki utilitas kecil yang saya gunakan untuk mengunduh file MP3 dari sebuah situs web sesuai jadwal dan kemudian membangun / memperbarui file XML podcast yang telah saya tambahkan ke iTunes.
Pemrosesan teks yang membuat / memperbarui file XML ditulis dengan Python. Namun, saya menggunakan wget di dalam .bat
file Windows untuk mengunduh file MP3 yang sebenarnya. Saya lebih suka memiliki seluruh utilitas ditulis dengan Python.
Saya kesulitan menemukan cara untuk benar-benar mengunduh file dengan Python, jadi mengapa saya terpaksa menggunakan wget
.
Jadi, bagaimana cara mengunduh file menggunakan Python?
wget
. Antara lain,wget
(1) menjaga stempel waktu (2) secara otomatis menentukan nama file dari url, menambahkan.1
(dll) jika file sudah ada (3) memiliki banyak opsi lain, beberapa di antaranya mungkin Anda masukkan ke dalam.wgetrc
. Jika Anda menginginkan salah satu dari itu, Anda harus mengimplementasikannya sendiri dengan Python, tetapi lebih mudah untuk hanya memanggilwget
dari Python.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Jawaban:
Dalam Python 2, gunakan urllib2 yang datang dengan pustaka standar.
Ini adalah cara paling dasar untuk menggunakan perpustakaan, minus penanganan kesalahan. Anda juga dapat melakukan hal-hal yang lebih kompleks seperti mengganti tajuk. Dokumentasi dapat ditemukan di sini.
sumber
urllib2.quote
Satu lagi, menggunakan
urlretrieve
:(untuk penggunaan Python 3+
import urllib.request
danurllib.request.urlretrieve
)Satu lagi, dengan "progressbar"
sumber
if not os.path.isfile(file_name):
untuk menghindari menimpa podcast! berguna saat menjalankannya sebagai cronjob dengan url yang ditemukan dalam file .htmlPada 2012, gunakan pustaka permintaan python
Anda bisa lari
pip install requests
untuk mendapatkannya.Permintaan memiliki banyak keunggulan dibandingkan alternatif karena API jauh lebih sederhana. Ini terutama benar jika Anda harus melakukan otentikasi. urllib dan urllib2 sangat tidak intuitif dan menyakitkan dalam kasus ini.
2015-12-30
Orang-orang telah menyatakan kekagumannya terhadap progress bar. Itu keren, tentu saja. Ada beberapa solusi siap pakai sekarang, termasuk
tqdm
:Ini pada dasarnya adalah implementasi @kvance yang diuraikan 30 bulan lalu.
sumber
r.text
Untuk konten teks atau unicode. Dikembalikan sebagai unicode.r.content
: Untuk konten biner. Dikembalikan sebagai byte. Baca tentang ini di sini: docs.python-requests.org/en/latest/user/quickstartThe
wb
dalamopen('test.mp3','wb')
membuka file (dan menghapus file yang ada) dalam mode biner sehingga Anda dapat menyimpan data dengan itu bukan hanya teks.sumber
file.read
jumlah byte yang dibaca. Lihat: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
sebagai gantinya.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Catatan: Menurut dokumentasi,
urllib.request.urlretrieve
adalah "antarmuka lama" dan "mungkin menjadi usang di masa depan" (terima kasih gerrit )Python 2
urllib2.urlopen
(terima kasih Corey )urllib.urlretrieve
(terima kasih PabloG )sumber
urllib.request.urlretrieve
atas itu akan membawa Anda ke tautan yang tepat. Bersulang!urllib.request.urlretrieve
didokumentasikan sebagai "antarmuka warisan" dan "mungkin menjadi usang di masa depan".gunakan modul wget:
sumber
Versi perbaikan dari kode PabloG untuk Python 2/3:
sumber
Cara sederhana namun
Python 2 & Python 3
kompatibel dilengkapi dengansix
perpustakaan:sumber
sumber
Menulis pustaka wget dengan Python murni hanya untuk tujuan ini. Dipompa
urlretrieve
dengan fitur-fitur ini pada versi 2.0.sumber
-o
menjadi-O
untuk menghindari kebingungan, seperti di GNU wget. Atau setidaknya kedua opsi harus valid.wget.py
pengganti di tempat untuk yang sebenarnyawget
. Yang-o
sudah berperilaku berbeda - itu kompatibel dengancurl
cara ini. Apakah catatan dalam dokumentasi membantu menyelesaikan masalah? Atau itu adalah fitur penting untuk utilitas dengan nama yang sesuai baris perintah?Berikut ini adalah panggilan yang paling sering digunakan untuk mengunduh file dengan python:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Catatan:
urlopen
danurlretrieve
ternyata kinerjanya relatif buruk dengan mengunduh file besar (ukuran> 500 MB).requests.get
menyimpan file dalam memori hingga unduhan selesai.sumber
Saya setuju dengan Corey, urllib2 lebih lengkap daripada urllib dan seharusnya menjadi modul yang digunakan jika Anda ingin melakukan hal-hal yang lebih kompleks, tetapi untuk membuat jawabannya lebih lengkap, urllib adalah modul yang lebih sederhana jika Anda hanya menginginkan dasar-dasarnya:
Akan bekerja dengan baik. Atau, jika Anda tidak ingin berurusan dengan objek "respons", Anda dapat memanggil read () secara langsung:
sumber
Dalam python3 Anda dapat menggunakan urllib3 dan libraires shutil. Unduh mereka dengan menggunakan pip atau pip3 (Tergantung apakah python3 default atau tidak)
Kemudian jalankan kode ini
Perhatikan bahwa Anda mengunduh
urllib3
tetapi menggunakanurllib
kodesumber
Anda bisa mendapatkan umpan balik kemajuan dengan urlretrieve juga:
sumber
Jika Anda telah menginstal wget, Anda dapat menggunakan parallel_sync.
pip instal parallel_sync
Doc: https://pythonhosted.org/parallel_sync/pages/examples.html
Ini sangat kuat. Ia dapat mengunduh file secara paralel, mencoba lagi setelah kegagalan, dan bahkan dapat mengunduh file pada mesin jarak jauh.
sumber
Jika kecepatan penting bagi Anda, saya membuat tes kinerja kecil untuk modul
urllib
danwget
, danwget
saya mencoba sekali dengan status bar dan sekali tanpa. Saya mengambil tiga file 500MB berbeda untuk diuji dengan (file yang berbeda-untuk menghilangkan kemungkinan ada beberapa caching terjadi di bawah tenda). Diuji pada mesin debian, dengan python2.Pertama, ini adalah hasilnya (mereka serupa dalam menjalankan berbeda):
Cara saya melakukan tes menggunakan dekorator "profil". Ini adalah kode lengkap:
urllib
tampaknya menjadi yang tercepatsumber
Hanya demi kelengkapan, dimungkinkan juga untuk memanggil program apa pun untuk mengambil file menggunakan
subprocess
paket. Program yang didedikasikan untuk mengambil file lebih kuat daripada fungsi Pythonurlretrieve
. Misalnya,wget
dapat mengunduh direktori secara rekursif (-R
), dapat menangani FTP, arahan ulang, proxy HTTP, dapat menghindari mengunduh ulang file yang ada (-nc
), danaria2
dapat melakukan unduhan multi-koneksi yang berpotensi mempercepat unduhan Anda.Di Jupyter Notebook, Anda juga dapat memanggil program secara langsung dengan
!
sintaks:sumber
Kode sumber dapat:
sumber
Anda dapat menggunakan PycURL di Python 2 dan 3.
sumber
Saya menulis yang berikut, yang bekerja di vanilla Python 2 atau Python 3.
Catatan:
sumber
Ini mungkin agak terlambat, Tapi saya melihat kode pabloG dan tidak dapat membantu menambahkan sistem os.s ('cls') agar terlihat MENGAGUMKAN! Coba lihat :
Jika berjalan di lingkungan selain Windows, Anda harus menggunakan sesuatu selain 'cls'. Di MAC OS X dan Linux itu harus 'jelas'.
sumber
cls
tidak melakukan apa pun pada OS X saya atau pada server Ubuntu saya. Beberapa klarifikasi bisa bagus.clear
untuk linux, atau bahkan lebih baik mengganti jalur cetak daripada menghapus seluruh output baris perintah.os.system()
) yang meluncurkan subproses untuk menghapus layar menggunakan perintah spesifik platform (cls
). Bagaimana ini setiap upvotes ?? IMHO "jawaban" sama sekali tidak berharga.urlretrieve dan requests.get sederhana, namun kenyataannya tidak. Saya telah mengambil data untuk beberapa situs, termasuk teks dan gambar, dua di atas mungkin menyelesaikan sebagian besar tugas. tetapi untuk solusi yang lebih universal saya sarankan penggunaan urlopen. Karena ini termasuk dalam pustaka standar Python 3, kode Anda bisa berjalan di mesin apa pun yang menjalankan Python 3 tanpa pra-instal paket-situs
Jawaban ini memberikan solusi untuk HTTP 403 Forbidden saat mengunduh file melalui http menggunakan Python. Saya telah mencoba hanya modul permintaan dan urllib, modul lain mungkin menyediakan sesuatu yang lebih baik, tetapi ini adalah yang saya gunakan untuk menyelesaikan sebagian besar masalah.
sumber
Jawaban terlambat, tetapi untuk
python>=3.6
Anda dapat menggunakan:Instal
dload
dengan:sumber
Saya ingin mengunduh semua file dari halaman web. Saya mencoba
wget
tetapi gagal jadi saya memutuskan untuk rute Python dan saya menemukan utas ini.Setelah membacanya, saya telah membuat aplikasi baris perintah kecil
soupget
, memperluas jawaban yang sangat baik dari PabloG dan Stan dan menambahkan beberapa opsi yang bermanfaat.Ini menggunakan BeatifulSoup untuk mengumpulkan semua URL halaman dan kemudian unduh yang dengan ekstensi yang diinginkan. Akhirnya dapat mengunduh banyak file secara paralel.
Ini dia:
Contoh penggunaannya adalah:
Dan contoh aktual jika Anda ingin melihatnya beraksi:
sumber