Saya mencoba mengunduh dan menyimpan gambar dari web menggunakan requests
modul python .
Berikut adalah kode (yang berfungsi) yang saya gunakan:
img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
f.write(img.read())
Berikut adalah kode baru (tidak berfungsi) menggunakan requests
:
r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
img = r.raw.read()
with open(path, 'w') as f:
f.write(img)
Bisakah Anda membantu saya tentang atribut dari respons yang digunakan requests
?
python
urllib2
python-requests
shkschneider
sumber
sumber
Jawaban:
Anda bisa menggunakan
response.raw
objek file , atau beralih pada respons.Untuk menggunakan
response.raw
objek seperti file tidak akan, secara default, mendekode respons terkompresi (dengan GZIP atau deflate). Anda dapat memaksanya untuk mendekompresi untuk Anda dengan mengaturdecode_content
atribut keTrue
(requests
mengaturnyaFalse
untuk mengontrol decoding itu sendiri). Anda bisa menggunakanshutil.copyfileobj()
Python stream data ke objek file:Untuk beralih pada respons gunakan loop; iterasi seperti ini memastikan bahwa data didekompresi pada tahap ini:
Ini akan membaca data dalam 128 byte chunks; jika Anda merasa ukuran chunk lain berfungsi lebih baik, gunakan
Response.iter_content()
metode ini dengan ukuran chunk khusus:Perhatikan bahwa Anda perlu membuka file tujuan dalam mode biner untuk memastikan python tidak mencoba dan menerjemahkan baris baru untuk Anda. Kami juga mengatur
stream=True
agarrequests
tidak mengunduh seluruh gambar ke dalam memori terlebih dahulu.sumber
r2 = requests.post(r.url, data); print r2.content
. Tapi sekarang saya juga ingin tahufilename
. Apakah cara mereka dibersihkan? - saat ini saya menemukan nama file di header -r2.headers['content-disposition']
yang memberi saya output sebagai:'attachment; filename=DELS36532G290115.csi'
Saya parsing string ini untuk nama file ... apakah cara mereka lebih bersih?content-disposition
tajuk adalah cara untuk pergi ke sini; gunakancgi.parse_header()
untuk menguraikannya dan mendapatkan parameter;params = cgi.parse_header(r2.headers['content-disposition'])[1]
kemudianparams['filename']
.requests.Response
itu sendiri :for chunk in r: ...
. Memanggiliter_content()
tanpa suratchunk_size
wasiat akan dilakukan dalam potongan 1 byte .response.ok
tidak pernah didokumentasikan, dan ini menghasilkan true untuk status 1xx, 2xx atau 3xx, tetapi hanya 200 tanggapan yang memiliki badan tanggapan.Dapatkan objek seperti file dari permintaan dan salin ke file. Ini juga akan menghindari membaca semuanya ke dalam memori sekaligus.
sumber
r.raw.decode_content = True
sebelumnyashutil.copyfileobj(response.raw, out_file)
karenaby default, decode compressed responses (with GZIP or deflate)
, jadi Anda akan mendapatkan gambar nol file.Bagaimana dengan ini, solusi cepat.
sumber
f = open("/Users/apple/Desktop/sample.jpg", 'wb')
apa maksudmu dengan jalan ini !? saya ingin mengunduh gambarif response.ok:
Saya memiliki kebutuhan yang sama untuk mengunduh gambar menggunakan permintaan. Saya pertama kali mencoba jawaban Martijn Pieters, dan itu bekerja dengan baik. Tetapi ketika saya melakukan profil pada fungsi sederhana ini, saya menemukan bahwa ia menggunakan begitu banyak panggilan fungsi dibandingkan dengan urllib dan urllib2.
Saya kemudian mencoba cara yang direkomendasikan oleh penulis modul permintaan:
Ini jauh lebih mengurangi jumlah panggilan fungsi, sehingga mempercepat aplikasi saya. Ini kode profiler saya dan hasilnya.
Hasil untuk testRequest:
Dan hasil untuk testRequest2:
sumber
chunk_size
parameter yang default ke 1, jadiiter_content
iterasi dari aliran hasil 1 byte sekaligus. Lihat dokumentasi python-requests.org/en/latest/api/… .PIL
sini,with open(image_name, 'wb') as outfile: outfile.write(r.content)
cukup saja.PIL
juga tidak ada di perpustakaan standar membuat ini sedikit kurang portabel.iter_content
lambat karena Andachunk_size
terlalu kecil, jika Anda meningkatkannya menjadi 100k akan jauh lebih cepat.Ini mungkin lebih mudah daripada menggunakan
requests
. Ini adalah satu-satunya waktu saya menyarankan tidak menggunakanrequests
untuk melakukan hal-hal HTTP.Dua liner menggunakan
urllib
:Ada juga modul Python bagus bernama
wget
yang cukup mudah digunakan. Ditemukan di sini .Ini menunjukkan kesederhanaan desain:
Nikmati.
Sunting: Anda juga dapat menambahkan
out
parameter untuk menentukan jalur.sumber
wget
tanpa kerepotan. Terima kasih telah menyatakan manfaat menggunakanurllib3
urllib.request.urlretrieve("http://example.com", "file.ext")
.Cuplikan kode berikut mengunduh file.
File disimpan dengan nama file seperti di url yang ditentukan.
sumber
Ada 2 cara utama:
Menggunakan
.content
(paling sederhana / resmi) (lihat jawaban Zhenyi Zhang ):Menggunakan
.raw
(lihat jawaban Martijn Pieters ):Waktu keduanya tidak menunjukkan perbedaan yang nyata.
sumber
1.
jawaban Anda (menggunakanio.BytesIO
danImage
) adalah yang pertama yang bekerja untuk saya di Python 3.6. Jangan lupafrom PIL import Image
(danpip install Pillow
).Semudah mengimpor Gambar dan permintaan
sumber
Berikut adalah jawaban yang lebih ramah pengguna yang masih menggunakan streaming.
Cukup tentukan fungsi-fungsi ini dan panggil
getImage()
. Ini akan menggunakan nama file yang sama dengan url dan menulis ke direktori saat ini secara default, tetapi keduanya dapat diubah.The
request
keberaniangetImage()
didasarkan pada jawaban di sini dan keberanian darigetImageFast()
didasarkan pada jawaban di atas .sumber
Saya akan memposting jawaban karena saya tidak punya cukup rep untuk membuat komentar, tetapi dengan wget seperti yang diposting oleh Blairg23, Anda juga dapat memberikan parameter keluar untuk jalur.
sumber
Ini adalah respons pertama yang muncul untuk pencarian google tentang cara mengunduh file biner dengan permintaan. Jika Anda perlu mengunduh file sewenang-wenang dengan permintaan, Anda dapat menggunakan:
sumber
.close()
. Saya kira ini adalah jawaban terbaik pada 2019.Beginilah cara saya melakukannya
sumber
Anda dapat melakukan sesuatu seperti ini:
sumber