Как сохранить изображение локально с помощью Python, URL-адрес которого я уже знаю?

Я знаю URL-адрес изображения в Интернете.

например. http://www.digimouth.com/news/media/2011/09/google-logo.jpg, который содержит логотип Google.

Теперь, как загрузить это изображение с помощью Python без фактического открытия URL-адреса в браузере и сохранения файла вручную.

Ответ 1

Python 2

Вот более простой способ, если все, что вы хотите сделать, это сохранить его как файл:

import urllib

urllib.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")

Второй аргумент - это локальный путь, в котором файл должен быть сохранен.

Python 3

Как сказал SergO, приведенный ниже код должен работать с Python 3.

import urllib.request

urllib.request.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")

Ответ 2

import urllib
resource = urllib.urlopen("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")
output = open("file01.jpg","wb")
output.write(resource.read())
output.close()

file01.jpg будет содержать ваше изображение.

Ответ 3

Я написал a script, который делает именно это, и он доступен на моем github для вашего использования.

Я использовал BeautifulSoup, чтобы разрешить мне анализировать любой сайт для изображений. Если вы будете делать много скрепок (или собираетесь использовать мой инструмент), я предлагаю вам sudo pip install BeautifulSoup. Информация о BeautifulSoup доступна здесь.

Для удобства здесь мой код:

from bs4 import BeautifulSoup
from urllib2 import urlopen
import urllib

# use this image scraper from the location that 
#you want to save scraped images to

def make_soup(url):
    html = urlopen(url).read()
    return BeautifulSoup(html)

def get_images(url):
    soup = make_soup(url)
    #this makes a list of bs4 element tags
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + "images found.")
    print 'Downloading images to current working directory.'
    #compile our unicode list of image links
    image_links = [each.get('src') for each in images]
    for each in image_links:
        filename=each.split('/')[-1]
        urllib.urlretrieve(each, filename)
    return image_links

#a standard call looks like this
#get_images('http://www.wookmark.com')

Ответ 4

Решение, которое работает с Python 2 и Python 3:

try:
    from urllib.request import urlretrieve  # Python 3
except ImportError:
    from urllib import urlretrieve  # Python 2

url = "http://www.digimouth.com/news/media/2011/09/google-logo.jpg"
urlretrieve(url, "local-filename.jpg")

Ответ 5

Я сделал расширение script на Yup. script. Я исправил некоторые вещи. Теперь он обходит 403: Запрещенные проблемы. Это не сбой, когда изображение не будет восстановлено. Он пытается избежать искаженных превью. Он получает правильные абсолютные URL-адреса. Это дает больше информации. Его можно запустить с помощью аргумента из командной строки.

# getem.py
# python2 script to download all images in a given url
# use: python getem.py http://url.where.images.are

from bs4 import BeautifulSoup
import urllib2
import shutil
import requests
from urlparse import urljoin
import sys
import time

def make_soup(url):
    req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
    html = urllib2.urlopen(req)
    return BeautifulSoup(html, 'html.parser')

def get_images(url):
    soup = make_soup(url)
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + " images found.")
    print 'Downloading images to current working directory.'
    image_links = [each.get('src') for each in images]
    for each in image_links:
        try:
            filename = each.strip().split('/')[-1].strip()
            src = urljoin(url, each)
            print 'Getting: ' + filename
            response = requests.get(src, stream=True)
            # delay to avoid corrupted previews
            time.sleep(1)
            with open(filename, 'wb') as out_file:
                shutil.copyfileobj(response.raw, out_file)
        except:
            print '  An error occured. Continuing.'
    print 'Done.'

if __name__ == '__main__':
    url = sys.argv[1]
    get_images(url)

Ответ 7

Это очень короткий ответ.

import urllib
urllib.urlretrieve("http://photogallery.sandesh.com/Picture.aspx?AlubumId=422040", "Abc.jpg")

Ответ 8

img_data=requests.get('https://apod.nasa.gov/apod/image/1701/potw1636aN159_HST_2048.jpg')

with open(str('file_name.jpg', 'wb') as handler:
    handler.write(img_data)