Bagaimana cara menyimpan gambar secara lokal menggunakan Python yang alamat URL-nya sudah saya ketahui?

Jawaban:

316

Python 2

Ini cara yang lebih mudah jika Anda ingin menyimpannya sebagai file:

import urllib

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

Argumen kedua adalah jalur lokal tempat file harus disimpan.

Python 3

Seperti yang disarankan SergO, kode di bawah ini harus bekerja dengan Python 3

import urllib.request

urllib.request.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")
Liquid_Fire
sumber
55
Cara yang baik untuk mendapatkan nama file dari tautan adalahfilename = link.split('/')[-1]
heltonbiker
2
dengan urlretrieve saya hanya mendapatkan file 1KB dengan dict dan 404 teks kesalahan di dalamnya. Mengapa? Jika saya memasukkan url ke browser saya, saya bisa mendapatkan gambar
Yebach
2
@Yebach: Situs yang Anda unduh mungkin menggunakan cookie, User-Agent atau header lain untuk menentukan konten apa yang melayani Anda. Ini akan berbeda antara browser Anda dan Python.
Liquid_Fire
27
Python 3 : import urllib.request danurllib.request.urlretrieve(), karenanya.
SergO
1
@ SergO - dapatkah Anda menambahkan bagian Python 3 ke jawaban asli?
Sreejith Menon
27
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 akan berisi gambar Anda.

Noufal Ibrahim
sumber
2
Anda harus membuka file dalam mode biner: open("file01.jpg", "wb")Jika tidak, Anda dapat merusak gambar.
Liquid_Fire
2
urllib.urlretrievedapat menyimpan gambar secara langsung.
heltonbiker
17

Saya menulis sebuah skrip yang melakukan hal ini , dan tersedia di github saya untuk Anda gunakan.

Saya menggunakan BeautifulSoup untuk memungkinkan saya mem-parsing situs web apa pun untuk gambar. Jika Anda akan melakukan banyak pengikisan web (atau bermaksud menggunakan alat saya), saya sarankan Anda sudo pip install BeautifulSoup. Informasi tentang BeautifulSoup tersedia di sini .

Untuk kenyamanan di sini adalah kode saya:

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')
Ya.
sumber
11

Ini bisa dilakukan dengan permintaan. Memuat halaman dan membuang konten biner ke file.

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)
AlexG
sumber
1
header pengguna dalam permintaan jika mendapatkan permintaan yang buruk :)
1UC1F3R616
8

Python 3

urllib.request - Pustaka yang dapat diperluas untuk membuka URL

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
SergO
sumber
6

Solusi yang berfungsi dengan Python 2 dan 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")

atau, jika persyaratan tambahan requestsdapat diterima dan jika itu adalah http (s) URL:

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)
Martin Thoma
sumber
5

Saya membuat skrip yang diperluas pada skrip Yup. Saya memperbaiki beberapa hal. Sekarang akan memotong 403: Masalah terlarang. Ini tidak akan crash ketika gambar gagal diambil. Mencoba menghindari pratinjau yang rusak. Itu mendapatkan url absolut yang tepat. Ini memberi lebih banyak informasi. Itu bisa dijalankan dengan argumen dari baris perintah.

# 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)
madprops
sumber
3

Menggunakan perpustakaan permintaan

import requests
import shutil,os

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
currentDir = os.getcwd()
path = os.path.join(currentDir,'Images')#saving images to Images folder

def ImageDl(url):
    attempts = 0
    while attempts < 5:#retry 5 times
        try:
            filename = url.split('/')[-1]
            r = requests.get(url,headers=headers,stream=True,timeout=5)
            if r.status_code == 200:
                with open(os.path.join(path,filename),'wb') as f:
                    r.raw.decode_content = True
                    shutil.copyfileobj(r.raw,f)
            print(filename)
            break
        except Exception as e:
            attempts+=1
            print(e)


ImageDl(url)
Sohan Das
sumber
Tampaknya header sangat penting dalam kasus saya, saya mendapatkan 403 kesalahan. Itu berhasil.
Ishtiyaq Husain
2

Ini jawaban yang sangat singkat.

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

Versi untuk Python 3

Saya menyesuaikan kode @madprops untuk Python 3

# 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 __name__ == '__main__':
    get_images('http://www.wookmark.com')
Giovanni G. PY
sumber
1

Sesuatu yang segar untuk Python 3 menggunakan Permintaan:

Komentar dalam kode. Fungsi siap pakai.


import requests
from os import path

def get_image(image_url):
    """
    Get image based on url.
    :return: Image name if everything OK, False otherwise
    """
    image_name = path.split(image_url)[1]
    try:
        image = requests.get(image_url)
    except OSError:  # Little too wide, but work OK, no additional imports needed. Catch all conection problems
        return False
    if image.status_code == 200:  # we could have retrieved error page
        base_dir = path.join(path.dirname(path.realpath(__file__)), "images") # Use your own path or "" to use current working directory. Folder must exist.
        with open(path.join(base_dir, image_name), "wb") as f:
            f.write(image.content)
        return image_name

get_image("https://apod.nasddfda.gov/apod/image/2003/S106_Mishra_1947.jpg")
Pavel Pančocha
sumber
0

Jawaban terlambat, tetapi untuk python>=3.6Anda dapat menggunakan dload , yaitu:

import dload
dload.save("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")

jika Anda membutuhkan gambar sebagai bytes, gunakan:

img_bytes = dload.bytes("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")

instal menggunakan pip3 install dload

HUBUNGI19
sumber
-2
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)
Lewis Mann
sumber
4
Selamat Datang di Stack Overflow! Meskipun Anda mungkin telah memecahkan masalah pengguna ini, jawaban hanya kode tidak sangat membantu bagi pengguna yang datang ke pertanyaan ini di masa mendatang. Harap edit jawaban Anda untuk menjelaskan mengapa kode Anda memecahkan masalah awal.
Joe C
1
TypeError: a bytes-like object is required, not 'Response'. Pastihandler.write(img_data.content)
TitanFighter
Seharusnya begitu handler.write(img_data.read()).
jdhao