Urllib এবং পাইথনের মাধ্যমে একটি ছবি ডাউনলোড করা


182

সুতরাং আমি একটি পাইথন স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা ওয়েবকমিক্স ডাউনলোড করে এবং আমার ডেস্কটপে একটি ফোল্ডারে রাখে। আমি এখানে কয়েকটি অনুরূপ প্রোগ্রাম পেয়েছি যা একই রকম কিছু করে, তবে আমার যা প্রয়োজন তা ঠিক তেমন কিছুই করে না। আমি যেটির সর্বাধিক অনুরূপ খুঁজে পেয়েছি তা ঠিক এখানেই রয়েছে ( http://bytes.com/topic/python/answers/850927-problem- using-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" ফাইলটির জন্য আমার কম্পিউটার অনুসন্ধান করেছি, তবে যা কিছু পেয়েছি তা এটির ক্যাশেড ছবি picture আমি নিশ্চিত না যে এটি আমার কম্পিউটারে ফাইলটি সংরক্ষণ করেছে। একবার ফাইলটি কীভাবে ডাউনলোড করা যায় তা বুঝতে পারলে আমি মনে করি আমি কীভাবে বাকী অংশগুলি পরিচালনা করব। মূলত কেবল লুপের জন্য একটি ব্যবহার করুন এবং '00000000'। 'Jpg' এ স্ট্রিংটি বিভক্ত করুন এবং '00000000' সর্বাধিক সংখ্যায় বৃদ্ধি করুন, যা আমাকে একরকম নির্ধারণ করতে হবে। এটি করার সর্বোত্তম উপায়ে কোনও পুনরুদ্ধার বা কীভাবে ফাইলটি সঠিকভাবে ডাউনলোড করবেন?

ধন্যবাদ!

সম্পাদনা 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

ঠিক আছে, আমি তাদের সব ডাউনলোড করার জন্য পেয়েছি! অনলাইনে কয়টি কমিক রয়েছে তা নির্ধারণের জন্য আমি এখন খুব অকল্যাণকর সমাধানের সাথে আটকে আছি ... আমি মূলত প্রোগ্রামটি এমন একটি সংখ্যায় চালিয়ে যাচ্ছি যা আমি জানি কমিকের সংখ্যার চেয়ে বেশি এবং তারপরে একটি কমিক না আসার পরে একটি ব্যতিক্রম চালাচ্ছি এর অস্তিত্ব নেই, এবং যখন ব্যতিক্রমটি দ্বিগুণের বেশি হয়ে আসে (যেহেতু আমি মনে করি না যে দুটি কমিক কম মিস হবে) এটি ডাউনলোড করার মতো আরও কিছু নেই বলে ভেবে প্রোগ্রামটি ছেড়ে দেয় its যেহেতু আমার কাছে ওয়েবসাইটে অ্যাক্সেস নেই, ওয়েবসাইটে কতগুলি ফাইল রয়েছে তা নির্ধারণ করার কোনও সেরা উপায় কি? আমি আমার কোডটি এক সেকেন্ডে পোস্ট করব।
মাইক

creativebe.com/icombiner/merge-jpg.html আমি এক পিডিএফ সব .jpg ফাইল মার্জ করতে যে প্রোগ্রাম ব্যবহৃত। দুর্দান্ত কাজ করে, এবং এটি নিখরচায়!
মাইক

6
উত্তর হিসাবে আপনার সমাধান পোস্ট করা এবং এটি প্রশ্ন থেকে অপসারণ বিবেচনা করুন। প্রশ্ন পোস্টগুলি প্রশ্ন জিজ্ঞাসার জন্য, উত্তরগুলির জন্য উত্তরগুলির উত্তর :-)
বার্তোসকেপিপি

কেন এটি দিয়ে ট্যাগ করা হয় beautifulsoup? এই পোস্টটি শীর্ষ beautifulsoupপ্রশ্নের তালিকায় প্রদর্শিত হবে
P0W

1
@ P0W আমি আলোচিত ট্যাগটি সরিয়েছি।
kmonsoor

উত্তর:


250

পাইথন 2

Urllib.urlretrieve ব্যবহার করে

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

পাইথন ঘ

Urllib.request.urlretrieve ব্যবহার (পাইথন 3 এর উত্তরাধিকার ইন্টারফেসের অংশ, ঠিক একই কাজ করে)

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

আর্গুমেন্ট হিসাবে পাস করার পরে এটি ফাইল এক্সটেনশনটি কেটে ফেলা হচ্ছে বলে মনে হচ্ছে (এক্সটেনশনটি মূল URL এ উপস্থিত রয়েছে) present কোন ধারণা কেন?
জেফথম্পসন

1
তোমার, হ্যাঁ। আমি মনে করি আমি ধরে নিয়েছি যে কোনও ফাইল এক্সটেনশান দেওয়া না হলে ফাইলটির সম্প্রসারণ সংযুক্ত করা হবে। এ সময়টি আমার কাছে তা উপলব্ধি করেছিল, তবে আমি মনে করি এখন আমি কী ঘটছে তা বুঝতে পেরেছি।
জেফথম্পসন

65
পাইথন 3 এর জন্য দ্রষ্টব্য আপনার [url.request] আমদানি করতে হবে ( docs.python.org/3.0/library/… ):import urllib.request urllib.request.retrieve("http://...")
ওয়াসাবিগেক

1
দ্রষ্টব্য যে পাইথন 3 ডক্স তালিকাটি "লিগ্যাসি ইন্টারফেস" এর অংশ হিসাবে পুনরুদ্ধার করে এবং বলে যে এটি ভবিষ্যতে অবনমিত হতে পারে।
নাথান ওয়েলস

18
পাইথন 3 এর জন্য নোট করুন এটি আসলে import urllib.request urllib.request.urlretrieve("http://...jpg", "1.jpg")। এটি urlretrieveএখন 3.x হিসাবে
ব্যবহারকারী 1032613

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

যদিও এটি অনুরোধগুলির জন্য পরীক্ষা করা উচিত get (ত্রুটি) ত্রুটি।


1
এমনকি যদি এই সমাধানটি urllib ব্যবহার না করে তবে আপনি ইতিমধ্যে আপনার পাইথন স্ক্রিপ্টটিতে অনুরোধ গ্রন্থাগারটি ইতিমধ্যে ব্যবহার করছেন (এটি অনুসন্ধান করার সময় এটি আমার ক্ষেত্রে ছিল) যাতে আপনি এটি ব্যবহার করতে চাইলে আপনার ছবিগুলি পেতেও পারেন।
আইএম জেশ

এই উত্তরটি অন্যের উপরে পোস্ট করার জন্য আপনাকে ধন্যবাদ। আমার ডাউনলোডটি কাজ করার জন্য কাস্টম শিরোনামের প্রয়োজন শেষ হয়ে গেল, এবং অনুরোধ লাইব্রেরির পয়েন্টারটি আমার পক্ষে সবকিছু যথেষ্ট পরিমাণে কাজ করার প্রক্রিয়াটি ছোট করে দিয়েছে।
কুজুরু

পাইথন 3 এ কাজ করার জন্য urllibও পেতে পারেনি। অনুরোধগুলির কোনও সমস্যা নেই এবং এটি ইতিমধ্যে লোড হয়েছে! আমি আরও ভাল পছন্দ।
ব্যবহারকারী 3023715

@ ব্যবহারকারী 3023715 অজগর 3 এ আপনি urllib থেকে অনুরোধ আমদানি করতে হবে এখানে দেখুন
ইয়াসাইন সেদরানী

34

পাইথন 3 এর জন্য আপনাকে আমদানি করতে হবে import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename)

আরও তথ্যের জন্য লিঙ্ক চেক আউট


15

@ ডিজিএমির উত্তরের পাইথন 3 সংস্করণ:

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

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
আপনার 'স্ব' অপসারণ করা উচিত
ইউফে

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

7

.read()আংশিক বা সম্পূর্ণ প্রতিক্রিয়া পড়ার জন্য এটি ব্যবহার করা সহজ then


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;

এর মতো একটি খালি ব্যবহার সম্পর্কে সতর্কতা অবলম্বন করুন, স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৫৯৪৪৮৮৮৮/২ দেখুন
এএমসি

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)


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")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.