python Zapisz obraz z adresu url

Mam problem, gdy używam Pythona do zapisywania obrazu z adresu url przez urllib2 request lub urllib.urlretrieve. To jest adres URL obrazu jest poprawny. Mogę go pobrać ręcznie za pomocą Eksploratora. Jednak gdy używam Pythona do pobrania obrazu, pliku nie można otworzyć. Używam Mac OS preview, aby wyświetlić obraz. Dziękuję!

Aktualizacja:

Kod jest następujący

def downloadImage(self):
    request = urllib2.Request(self.url)
    pic = urllib2.urlopen(request)
    print "downloading: " + self.url
    print self.fileName
    filePath = localSaveRoot + self.catalog  + self.fileName + Picture.postfix
    # urllib.urlretrieve(self.url, filePath)
    with open(filePath, 'wb') as localFile:
        localFile.write(pic.read())

Adres URL obrazu, który chcę pobrać na http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg

Ten adres URL jest poprawny i mogę go zapisać przez przeglądarkę, ale kod Pythona pobierze plik, którego nie można otworzyć. Podgląd mówi: "może być uszkodzony lub używać formatu pliku, którego podgląd nie rozpoznaje." Porównuję obraz pobrany przez Pythona i ten, który pobieram ręcznie przez przeglądarkę. Rozmiar pierwszego jest o kilka bajtów mniejszy. Wygląda na to, że plik jest niedokończony, ale nie wiem dlaczego python nie może go całkowicie pobrać.

Author: Shaoxiang Su, 2015-05-14

4 answers

Przykładowy kod, który działa u mnie na Windows:

with open('pic1.jpg', 'wb') as handle:
        response = requests.get(pic_url, stream=True)

        if not response.ok:
            print response

        for block in response.iter_content(1024):
            if not block:
                break

            handle.write(block)
 22
Author: DeepSpace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 04:34:47
import requests

img_data = requests.get(image_url).content
with open('image_name.jpg', 'wb') as handler:
    handler.write(img_data)
 25
Author: Vlad Bezden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 20:30:19

Urywek kodu Pythona do pobrania pliku z adresu url i zapisania jego nazwy

import requests

url = 'http://google.com/favicon.ico'
filename = url.split('/')[-1]
r = requests.get(url, allow_redirects=True)
open(filename, 'wb').write(r.content)
 1
Author: Basil Jose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 12:35:34
import random
import urllib.request

def download_image(url):
    name = random.randrange(1,100)
    fullname = str(name)+".jpg"
    urllib.request.urlretrieve(url,fullname)     
download_image("http://site.meishij.net/r/58/25/3568808/a3568808_142682562777944.jpg")
 0
Author: learner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 22:03:12