2013-02-22 86 views
15

我目前正在編寫一個腳本,它將圖像url下載到一個預先命名的文件中。使用什麼命令代替urllib.request.urlretrieve?

這裏是我的代碼的相關部分:

import urllib.request 

urllib.request.urlretrieve(image['url'],p) 

它採用 'URL' 並將其保存爲 'P'。

根據python文檔,urllib.request.urlretrieve是一個傳統接口,將來可能會被棄用,因此我想盡可能避免它,所以我不必很快重寫它。

我一直在試圖找到另一個命令,讓我做command(url,filename),但還沒有任何運氣。

你們有什麼好的建議,我應該用什麼命令呢?

哦,我也想避免使用外部庫,如果可能的話。

回答

17

棄用是一回事,可能在某些時候在將來成爲不贊成是另一回事。

如果它適合您的需求,我會繼續使用urlretrieve

這就是說,你也離不開它:

from urllib.request import urlopen 
from shutil import copyfileobj 

with urlopen(image['url']) as in_stream, open(p, 'wb') as out_file: 
    copyfileobj(in_stream, out_file) 
+1

非常感謝。我不知道shutil庫甚至存在:) – Marc2540 2013-02-24 10:04:53

+0

哇,這工作很好。我一直在尋找同樣的東西,但對於小部分音頻,並不知道如何將其保存到文件。沒有找到'urlretrieve'一段時間,我沒有意識到'urlopen'會給我字節 - 我想我應該尋找一種可以保存文件的方法,不要進入文件並讀/保存位。我想這是編程的標準做法,所以它應該是有道理的,但我從來沒有使用過I/O。謝謝,這比我擔心它可能會更簡單。 – 2016-03-31 09:46:08

+0

感謝copyfileobj! 'urlretrieve'的問題在於它無法確定服務器故障(502/404 /其他)。 – y0prst 2017-01-18 15:39:53

2

可以使用urllib2;你或許應該使用requests

urllib是傳統

urllib2是超越痛苦的使用

+0

我應該可能在我的文章的正文中提到了這一點,而不僅僅是標籤,但我使用的是Python 3.3,其中urllib2已合併到urllib中。 – Marc2540 2013-02-24 10:08:43

10

請求是非常好的這一點。儘管安裝它有一些依賴關係。這是一個例子。

import requests 
r = requests.get('imgurl') 
with open('pic.jpg','wb') as f: 
    f.write(r.content) 
0

我想補充一點,這個工作也XML文件。

0

另一種不使用shutil的解決方案,也沒有其他外部庫如requests

import urllib.request 

image = {'url': 'https://cdn.sstatic.net/Sites/stackoverflow/img/appletouch-icon.png'} 
p = 'image.png' 

response = urllib.request.urlopen(image['url']) 
image = response.read() 

file = open(p, 'wb') 

file.write(image) 
file.close() 
+0

嗨,歡迎來到SO。僅有代碼的答案通常被認爲不太有用。請編輯您的答案以添加一些上下文並解釋您的解決方案。 – 2018-01-28 04:51:55