पायथन का उपयोग करके स्थानीय रूप से एक छवि को कैसे बचाया जाए जिसका URL पता मुझे पहले से पता है?


152

मैं इंटरनेट पर एक छवि का URL जानता हूं।

जैसे http://www.digimouth.com/news/media/2011/09/google-logo.jpg , जिसमें Google का लोगो है।

अब, मैं वास्तव में एक ब्राउज़र में URL को खोलने और फ़ाइल को मैन्युअल रूप से सहेजे बिना पायथन का उपयोग करके इस छवि को कैसे डाउनलोड कर सकता हूं।


जवाबों:


316

अजगर २

यहाँ एक और अधिक सरल तरीका है यदि आप सब करना चाहते हैं तो इसे एक फ़ाइल के रूप में सहेजें:

import urllib

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

दूसरा तर्क स्थानीय पथ है जहां फ़ाइल को सहेजा जाना चाहिए।

अजगर ३

जैसा कि सर्गियो ने सुझाव दिया था कि नीचे दिए गए कोड को पायथन 3 के साथ काम करना चाहिए।

import urllib.request

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

55
लिंक से फ़ाइल नाम प्राप्त करने का एक अच्छा तरीका हैfilename = link.split('/')[-1]
हेल्टनबिकर

2
urlretrieve के साथ मुझे सिर्फ एक 1KB फाइल मिलनी चाहिए जिसमें एक तानाशाही और 404 त्रुटि पाठ है। क्यों? अगर मैं अपने ब्राउज़र में url
डालूं

2
@Yebach: जिस साइट से आप डाउनलोड कर रहे हैं वह कुकीज़, उपयोगकर्ता-एजेंट या अन्य हेडर का उपयोग करके निर्धारित कर सकती है कि आपको क्या सेवा प्रदान करनी है। ये आपके ब्राउज़र और पायथन के बीच भिन्न होंगे।
लिक्विड_फायर

27
अजगर 3 : import urllib.request औरurllib.request.urlretrieve(), तदनुसार।
सर्गियो

1
@ शेरो - क्या आप मूल उत्तर में पायथन 3 भाग जोड़ सकते हैं?
श्रीजिथ मेनन

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 आपकी छवि सम्‍मिलित होगी।


2
आपको फ़ाइल को बाइनरी मोड में खोलना चाहिए: open("file01.jpg", "wb")अन्यथा आप छवि को दूषित कर सकते हैं।
तरल_फायर

2
urllib.urlretrieveसीधे छवि को बचा सकता है।
हेल्टनबाइकर

17

मैंने एक स्क्रिप्ट लिखी है जो सिर्फ यही करती है , और यह आपके उपयोग के लिए मेरे गीथब पर उपलब्ध है।

मैंने सुंदरएसओपीपी का उपयोग करके मुझे छवियों के लिए किसी भी वेबसाइट को पार्स करने की अनुमति दी। यदि आप बहुत अधिक वेब स्क्रैपिंग कर रहे हैं (या मेरे उपकरण का उपयोग करने का इरादा रखते हैं) तो मैं आपको सुझाव देता हूं sudo pip install 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')

11

यह अनुरोधों के साथ किया जा सकता है। पृष्ठ लोड करें और बाइनरी सामग्री को फ़ाइल में डंप करें।

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
खराब अनुरोध मिलने पर उपयोगकर्ता हेडर में :)
1UC1F3R616


6

एक समाधान जो पायथन 2 और पायथन 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")

या, यदि अतिरिक्त आवश्यकता requestsस्वीकार्य है और यदि यह 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)

5

मैंने यूप की पटकथा पर विस्तार करते हुए एक स्क्रिप्ट बनाई। मैंने कुछ चीजें तय कीं। यह अब 403 को बायपास करेगा: निषिद्ध समस्याओं। जब कोई छवि पुनर्प्राप्त करने में विफल हो जाती है तो यह दुर्घटना नहीं होगी। यह भ्रष्ट पूर्वावलोकन से बचने की कोशिश करता है। यह सही निरपेक्ष उरोज प्राप्त करता है। यह अधिक जानकारी देता है। इसे कमांड लाइन से एक तर्क के साथ चलाया जा सकता है।

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

3

पुस्तकालय का उपयोग करना

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)

ऐसा लगता है कि हेडर वास्तव में मेरे मामले में महत्वपूर्ण है, मुझे 403 त्रुटियां हो रही थीं। इसने काम कर दिया।
इश्तियाक हुसैन

2

यह बहुत ही कम जवाब है।

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

2

पायथन 3 के लिए संस्करण

मैंने पायथन 3 के लिए @madprops का कोड समायोजित किया

# 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')

1

अनुरोधों का उपयोग करते हुए पायथन 3 के लिए कुछ नया:

कोड में टिप्पणियाँ। फ़ंक्शन का उपयोग करने के लिए तैयार है।


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

0

देर से जवाब, लेकिन python>=3.6आप के लिए लोड का उपयोग कर सकते हैं , यानी:

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

यदि आपको चित्र की आवश्यकता है bytes, तो उपयोग करें:

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

का उपयोग कर स्थापित करें pip3 install dload


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

4
ढेर अतिप्रवाह में आपका स्वागत है! हालांकि आपने इस उपयोगकर्ता की समस्या को हल कर लिया है, लेकिन भविष्य में इस सवाल पर आने वाले उपयोगकर्ताओं के लिए कोड-ओनली उत्तर बहुत उपयोगी नहीं हैं। कृपया अपने उत्तर को यह समझाने के लिए संपादित करें कि आपका कोड मूल समस्या को क्यों हल करता है।
जो सी

1
TypeError: a bytes-like object is required, not 'Response'। यह होना चाहिएhandler.write(img_data.content)
टाइटनफाइटर

यह होना चाहिए handler.write(img_data.read())
जेडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.