web-dev-qa-db-de.com

Wie kann ich ein Bild lokal mit Python speichern, dessen URL-Adresse ich bereits kenne?

Ich kenne die URL eines Bildes im Internet.

z.B. http://www.digimouth.com/news/media/2011/09/google-logo.jpg , das das Logo von Google enthält.

Wie kann ich dieses Bild jetzt mit Python herunterladen, ohne die URL tatsächlich in einem Browser zu öffnen und die Datei manuell zu speichern.

116
Pankaj Vatsa

Python 2

Der einfachere Weg, wenn Sie es nur als Datei speichern möchten:

import urllib

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

Das zweite Argument ist der lokale Pfad, in dem die Datei gespeichert werden soll.

Python 3

Wie SergO vorschlug, sollte der folgende Code mit Python 3 funktionieren.

import urllib.request

urllib.request.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")
238
Liquid_Fire
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 enthält dein Bild. 

24
Noufal Ibrahim

Ich habe ein Skript geschrieben, das genau dieses macht, und es ist auf meinem Github für Ihre Verwendung verfügbar. 

Ich habe BeautifulSoup verwendet, um jede Website nach Bildern zu analysieren. Wenn Sie viel Web-Scraping durchführen (oder mein Werkzeug verwenden möchten), empfehle ich Ihnen Sudo pip install BeautifulSoup. Informationen zu BeautifulSoup sind verfügbar hier .

Zur Vereinfachung ist hier mein Code:

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')
15
Yup.

Eine Lösung, die mit Python 2 und Python 3 funktioniert:

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")

oder, wenn die zusätzliche Anforderung von requests akzeptabel ist und wenn es sich um eine http (s) -URL handelt:

def load_requests(source_url, sink_path):
    """
    Load a file from an URL (e.g. http).

    Parameters
    ----------
    source_url : str
        Where to load the file from.
    sink_path : str
        Where the loaded file is stored.
    """
    import requests
    r = requests.get(source_url, stream=True)
    if r.status_code == 200:
        with open(sink_path, 'wb') as f:
            for chunk in r:
                f.write(chunk)
6
Martin Thoma

Python 3

urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs

from urllib.error import HTTPError
from urllib.request import urlretrieve

try:
    urlretrieve(image_url, image_local_path)
except FileNotFoundError as err:
    print(err)   # something wrong with local path
except HTTPError as err:
    print(err)  # something wrong with url
5
SergO

Ich habe ein Skript erstellt, das das Skript von Yup. erweitert. Ich habe einige Dinge behoben. Es wird jetzt 403 umgangen: Verbotene Probleme. Es wird nicht abstürzen, wenn ein Bild nicht abgerufen werden kann. Es wird versucht, beschädigte Vorschauen zu vermeiden. Es bekommt die richtigen absoluten URLs. Es gibt mehr Informationen heraus. Es kann mit einem Argument von der Befehlszeile aus ausgeführt werden. 

# 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 __== '__main__':
    url = sys.argv[1]
    get_images(url)
5
madprops

Version für Python 3

Ich habe den Code von @madprops für Python 3 angepasst

# 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 urllib.request
import shutil
import requests
from urllib.parse import urljoin
import sys
import time

def make_soup(url):
    req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
    html = urllib.request.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 __== '__main__':
    get_images('http://www.wookmark.com')
1
Giovanni Gianni

Dies kann mit Anfragen erfolgen. Laden Sie die Seite und geben Sie den binären Inhalt in eine Datei aus.

import os
import requests

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

f_ext = os.path.splitext(url)[-1]
f_name = 'img{}'.format(f_ext)
with open(f_name, 'wb') as f:
    f.write(page.content)
1
AlexG

Dies ist eine sehr kurze Antwort.

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