Urllib और python के माध्यम से चित्र डाउनलोड करना


182

इसलिए मैं एक पायथन स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो वेबकॉमिक्स डाउनलोड करती है और उन्हें अपने डेस्कटॉप पर एक फ़ोल्डर में रखती है। मुझे यहाँ कुछ ऐसे ही प्रोग्राम मिले हैं जो कुछ ऐसा ही करते हैं, लेकिन मुझे जैसा चाहिए वैसा कुछ भी नहीं। जो मुझे सबसे मिलता-जुलता लगा, वह यहीं है ( http://bytes.com/topic/python/answers/850927-problem-use-urllib-download-images )। मैंने इस कोड का उपयोग करने की कोशिश की:

>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)

मैंने तब अपने कंप्यूटर को एक फ़ाइल "00000001.jpg" के लिए खोजा, लेकिन मुझे जो भी मिला वह उसकी कैश्ड तस्वीर थी। मुझे यकीन नहीं है कि इसने मेरे कंप्यूटर में फ़ाइल को सहेजा है। एक बार जब मैं समझ गया कि फ़ाइल को कैसे डाउनलोड किया जाए, तो मुझे लगता है कि मुझे पता है कि बाकी को कैसे संभालना है। अनिवार्य रूप से सिर्फ लूप के लिए उपयोग करें और स्ट्रिंग को '00000000' पर विभाजित करें। 'jpg' और '00000000' को सबसे बड़ी संख्या तक बढ़ाता है, जिसे मुझे किसी तरह निर्धारित करना होगा। सबसे अच्छा तरीका यह करने के लिए या फ़ाइल को सही ढंग से डाउनलोड करने के लिए कोई भी रसीदें?

धन्यवाद!

EDIT 6/15/10

यहां पूरी की गई स्क्रिप्ट है, यह फ़ाइलों को आपके द्वारा चुनी गई किसी भी निर्देशिका में सहेजती है। कुछ अजीब कारण से, फाइलें डाउनलोड नहीं हो रही थीं और उन्होंने बस कर दिया। इसे कैसे साफ किया जाए, इस पर किसी भी सुझाव की बहुत सराहना की जाएगी। मैं वर्तमान में काम कर रहा हूं कि साइट पर कई कॉमिक्स का पता कैसे लगाया जाए ताकि मैं सिर्फ एक नवीनतम प्राप्त कर सकूं, बजाय इसके कि एक निश्चित संख्या में अपवाद उठाए जाने के बाद कार्यक्रम छोड़ दिया जाए।

import urllib
import os

comicCounter=len(os.listdir('/file'))+1  # reads the number of files in the folder to start downloading at the next comic
errorCount=0

def download_comic(url,comicName):
    """
    download a comic in the form of

    url = http://www.example.com
    comicName = '00000000.jpg'
    """
    image=urllib.URLopener()
    image.retrieve(url,comicName)  # download comicName at URL

while comicCounter <= 1000:  # not the most elegant solution
    os.chdir('/file')  # set where files download to
        try:
        if comicCounter < 10:  # needed to break into 10^n segments because comic names are a set of zeros followed by a number
            comicNumber=str('0000000'+str(comicCounter))  # string containing the eight digit comic number
            comicName=str(comicNumber+".jpg")  # string containing the file name
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)  # creates the URL for the comic
            comicCounter+=1  # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception
            download_comic(url,comicName)  # uses the function defined above to download the comic
            print url
        if 10 <= comicCounter < 100:
            comicNumber=str('000000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        if 100 <= comicCounter < 1000:
            comicNumber=str('00000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        else:  # quit the program if any number outside this range shows up
            quit
    except IOError:  # urllib raises an IOError for a 404 error, when the comic doesn't exist
        errorCount+=1  # add one to the error count
        if errorCount>3:  # if more than three errors occur during downloading, quit the program
            break
        else:
            print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist")  # otherwise say that the certain comic number doesn't exist
print "all comics are up to date"  # prints if all comics are downloaded

ठीक है, मैं उन सभी को डाउनलोड करने के लिए मिल गया! अब मैं कितने कॉमिक्स ऑनलाइन हैं, यह निर्धारित करने के लिए एक बहुत ही अशुभ समाधान के साथ फंस गया हूं ... मैं मूल रूप से एक नंबर पर कार्यक्रम चला रहा हूं, जो मुझे पता है कि कॉमिक्स की संख्या से अधिक है और फिर एक कॉमिक नहीं आता है जब एक अपवाद आता है यह मौजूद नहीं है, और जब अपवाद दो बार से अधिक आता है (क्योंकि मुझे नहीं लगता कि दो से अधिक कॉमिक्स गायब होंगे) यह प्रोग्राम को उद्धृत करता है, यह सोचकर कि डाउनलोड करने के लिए और कुछ नहीं है। चूंकि मेरे पास वेबसाइट तक पहुंच नहीं है, इसलिए यह निर्धारित करने का एक सबसे अच्छा तरीका है कि वेबसाइट पर कितनी फाइलें हैं? मैं एक सेकंड में अपना कोड पोस्ट करूंगा।
माइक

creativebe.com/icombiner/merge-jpg.html मैंने उस प्रोग्राम का उपयोग सभी .jpg फाइलों को एक पीडीएफ में मिलाने के लिए किया। भयानक काम करता है, और यह मुफ़्त है!
माइक

6
एक उत्तर के रूप में अपने समाधान को पोस्ट करने पर विचार करें, और इसे प्रश्न से हटा दें। प्रश्न पोस्ट प्रश्न पूछने के लिए हैं, उत्तर के लिए उत्तर पोस्ट्स :-)
बार्टोज़ज़क

यह क्यों टैग किया गया है beautifulsoup? यह पोस्ट शीर्ष beautifulsoupप्रश्न की सूची में
दिखाई देती है

1
@ P0W मैंने चर्चा किए गए टैग को हटा दिया है।
किमी।

जवाबों:


250

अजगर २

Urllib.urlretrieve का उपयोग करना

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

अजगर ३

Urllib.request.urlretrieve (Python 3 की विरासत इंटरफ़ेस का हिस्सा) का उपयोग करना , बिल्कुल वैसा ही काम करता है)

import urllib.request
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

यह तर्क के रूप में पारित होने पर मेरे लिए फ़ाइल एक्सटेंशन को काट रहा है (मूल URL में एक्सटेंशन मौजूद है)। कोई विचार क्यों?
जेफ्थॉमप्सन

1
तुम्हारा है, हाँ। मुझे लगता है कि मैंने यह मान लिया था कि यदि कोई फ़ाइल एक्सटेंशन नहीं दिया गया था, तो फ़ाइल का एक्सटेंशन जोड़ दिया जाएगा। यह मेरे लिए उस समय समझ में आया, लेकिन मुझे लगता है कि अब मुझे समझ में आ गया है कि क्या हो रहा है।
जेफ्थॉमप्सन

65
पायथन 3 के लिए ध्यान दें कि आपको [url.request] ( docs.python.org/3.0/library/… ) आयात करना होगा :import urllib.request urllib.request.retrieve("http://...")
wasabigeek

1
ध्यान दें कि पायथन 3 डॉक्स सूची एक "विरासत इंटरफ़ेस" के हिस्से के रूप में पुनर्प्राप्त () है और कहते हैं कि यह भविष्य में पदावनत हो सकता है।
नाथन वीलस

18
पायथन 3 के लिए नोट यह वास्तव में है import urllib.request urllib.request.urlretrieve("http://...jpg", "1.jpg")। यह urlretrieveअब 3.x के रूप में है।
user1032613

81
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()

68

बस रिकॉर्ड के लिए, अनुरोध पुस्तकालय का उपयोग कर।

import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()

हालाँकि यह request.get () त्रुटि के लिए जाँच करनी चाहिए।


1
यहां तक ​​कि अगर यह समाधान urllib का उपयोग नहीं कर रहा है, तो आप पहले से ही अपनी लायब्रेरी में पहले से ही अनुरोध लायब्रेरी का उपयोग कर रहे होंगे (जो कि इस मामले में खोज करते समय मेरा मामला था) ताकि आप अपनी तस्वीरों को प्राप्त करने के लिए इसका उपयोग करना चाहें।
Iam Zesh

इस उत्तर को दूसरों के ऊपर पोस्ट करने के लिए धन्यवाद। मैंने काम करने के लिए अपना डाउनलोड प्राप्त करने के लिए कस्टम हेडर की आवश्यकता समाप्त कर दी, और अनुरोध लाइब्रेरी के सूचक ने मेरे लिए काम करने के लिए सब कुछ प्राप्त करने की प्रक्रिया को छोटा कर दिया।
कुजूरू

Python3 में काम करने के लिए urllib भी नहीं मिला। अनुरोधों में कोई समस्या नहीं थी और यह पहले से ही लोड है! ज्यादा बेहतर विकल्प मुझे लगता है।
user3023715

@ user3023715 python3 में आपको urllib से अनुरोध आयात करने की आवश्यकता है यहां देखें
Yassine Sedrani

34

पायथन 3 के लिए आपको आयात करना होगा import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename)

अधिक जानकारी के लिए लिंक देखें



10

मुझे यह उत्तर मिल गया है और मैं इसे अधिक विश्वसनीय तरीके से संपादित करता हूं

def download_photo(self, img_url, filename):
    try:
        image_on_web = urllib.urlopen(img_url)
        if image_on_web.headers.maintype == 'image':
            buf = image_on_web.read()
            path = os.getcwd() + DOWNLOADED_IMAGE_PATH
            file_path = "%s%s" % (path, filename)
            downloaded_image = file(file_path, "wb")
            downloaded_image.write(buf)
            downloaded_image.close()
            image_on_web.close()
        else:
            return False    
    except:
        return False
    return True

इससे आपको डाउनलोड करते समय कभी कोई अन्य संसाधन या अपवाद नहीं मिलते हैं।


1
आपको
12 अप्रैल

8

यदि आप जानते हैं कि फाइलें dirवेबसाइट के एक ही डायरेक्टरी में स्थित हैं siteऔर निम्नलिखित प्रारूप हैं: filename_01.jpg, ..., filename_10.jpg तो उन सभी को डाउनलोड करें:

import requests

for x in range(1, 10):
    str1 = 'filename_%2.2d.jpg' % (x)
    str2 = 'http://site/dir/filename_%2.2d.jpg' % (x)

    f = open(str1, 'wb')
    f.write(requests.get(str2).content)
    f.close()


5

शायद आपको 'उपयोगकर्ता-एजेंट' की आवश्यकता हो:

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')]
response = opener.open('http://google.com')
htmlData = response.read()
f = open('file.txt','w')
f.write(htmlData )
f.close()

शायद पेज उपलब्ध नहीं है?
अलेक्जेंडर

3

सुझाव देने के अलावा कि आप डॉक्स को retrieve()ध्यान से पढ़ें ( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve ), मैं वास्तव read()में प्रतिक्रिया की सामग्री पर कॉल करने का सुझाव दूंगा, और फिर इसे सहेज कर रखूंगा। अस्थायी रूप से बनाई गई फ़ाइल को छोड़ने के बजाय अपने चुनने की एक फ़ाइल जो बनाता है।


3

उपरोक्त सभी कोड, मूल छवि नाम को संरक्षित करने की अनुमति नहीं देते हैं, जो कभी-कभी आवश्यक होती है। यह आपके स्थानीय ड्राइव पर चित्रों को सहेजने में मदद करेगा, मूल छवि नाम को संरक्षित करेगा

    IMAGE = URL.rsplit('/',1)[1]
    urllib.urlretrieve(URL, IMAGE)

अधिक जानकारी के लिए इसे आज़माएं


3

यह मेरे लिए अजगर 3 का उपयोग कर काम किया।

यह सीएसवी फ़ाइल से यूआरएल की एक सूची प्राप्त करता है और उन्हें एक फ़ोल्डर में डाउनलोड करना शुरू करता है। यदि सामग्री या छवि मौजूद नहीं है तो यह उस अपवाद को लेता है और अपना जादू जारी रखता है।

import urllib.request
import csv
import os

errorCount=0

file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg"

# CSV file must separate by commas
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path
with open ('urls.csv') as images:
    images = csv.reader(images)
    img_count = 1
    print("Please Wait.. it will take some time")
    for image in images:
        try:
            urllib.request.urlretrieve(image[0],
            file_list.format(img_count))
            img_count += 1
        except IOError:
            errorCount+=1
            # Stop in case you reach 100 errors downloading images
            if errorCount>100:
                break
            else:
                print ("File does not exist")

print ("Done!")

2

एक सरल समाधान हो सकता है (अजगर 3):

import urllib.request
import os
os.chdir("D:\\comic") #your path
i=1;
s="00000000"
while i<1000:
    try:
        urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg")
    except:
        print("not possible" + str(i))
    i+=1;

इसके अलावा नंगे का उपयोग करने के बारे में सावधान रहें, stackoverflow.com/questions/54948548/… देखें ।
AMC

1

इस बारे में क्या:

import urllib, os

def from_url( url, filename = None ):
    '''Store the url content to filename'''
    if not filename:
        filename = os.path.basename( os.path.realpath(url) )

    req = urllib.request.Request( url )
    try:
        response = urllib.request.urlopen( req )
    except urllib.error.URLError as e:
        if hasattr( e, 'reason' ):
            print( 'Fail in reaching the server -> ', e.reason )
            return False
        elif hasattr( e, 'code' ):
            print( 'The server couldn\'t fulfill the request -> ', e.code )
            return False
    else:
        with open( filename, 'wb' ) as fo:
            fo.write( response.read() )
            print( 'Url saved as %s' % filename )
        return True

##

def main():
    test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico'

    from_url( test_url )

if __name__ == '__main__':
    main()

0

यदि आपको प्रॉक्सी सपोर्ट चाहिए तो आप ऐसा कर सकते हैं:

  if needProxy == False:
    returnCode, urlReturnResponse = urllib.urlretrieve( myUrl, fullJpegPathAndName )
  else:
    proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress})
    opener = urllib2.build_opener(proxy_support)
    urllib2.install_opener(opener)
    urlReader = urllib2.urlopen( myUrl ).read() 
    with open( fullJpegPathAndName, "w" ) as f:
      f.write( urlReader )

0

ऐसा करने का एक और तरीका है फास्टै लाइब्रेरी। यह मेरे लिए एक आकर्षण की तरह काम करता था। मैं एक SSL: CERTIFICATE_VERIFY_FAILED Errorप्रयोग का सामना कर रहा था urlretrieveइसलिए मैंने कोशिश की।

url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)

मुझे एक SSL का सामना करना पड़ रहा था: CERTIFICATE_VERIFY_FAILED त्रुटि stackoverflow.com/questions/27835619/…
AMC

0

अनुरोधों का उपयोग करना

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)

if __name__ == '__main__':
    ImageDl(url)

0

Urllib का उपयोग करके, आप इसे तुरंत करवा सकते हैं।

import urllib.request

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)

urllib.request.urlretrieve(URL, "images/0.jpg")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.