python - সফটওয - সি++ প্রোগ্রামিং




অনুরোধ ব্যবহার করে ইমেজ ডাউনলোড করুন (8)

2 প্রধান উপায় আছে:

  1. .content ব্যবহার (সরল / সরকারী) ( ঝেনি ঝাং এর উত্তর দেখুন ):

    import io  # Note: io.BytesIO is StringIO.StringIO on Python2.
    import requests
    
    r = requests.get('http://lorempixel.com/400/200')
    r.raise_for_status()
    with io.BytesIO(r.content) as f:
        with Image.open(f) as img:
            img.show()
  2. .raw ব্যবহার করে ( মার্টিন .raw উত্তর দেখুন ):

    import requests
    
    r = requests.get('http://lorempixel.com/400/200', stream=True)
    r.raise_for_status()
    r.raw.decode_content = True  # Required to decompress gzip/deflate compressed responses.
    with PIL.Image.open(r.raw) as img:
        img.show()
    r.close()  # Safety when stream=True ensure the connection is released.

সময় উভয় কোন উল্লেখযোগ্য পার্থক্য দেখায়।

আমি পাইথনের requests মডিউল ব্যবহার করে ওয়েব থেকে একটি ছবি ডাউনলোড এবং সংরক্ষণ করার চেষ্টা করছি।

আমি ব্যবহার করা হয় (কাজ) কোড এখানে:

img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
    f.write(img.read())

এখানে requests ব্যবহার করে নতুন (নন-কাজ) কোডটি রয়েছে:

r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
    img = r.raw.read()
    with open(path, 'w') as f:
        f.write(img)

requests থেকে ব্যবহার প্রতিক্রিয়া থেকে কি বৈশিষ্ট্য আমাকে সাহায্য করতে পারেন?


অনুরোধ থেকে একটি ফাইল মত বস্তু পান এবং এটি একটি ফাইল অনুলিপি। এটি একসাথে স্মৃতিতে পুরো জিনিসটি পড়তেও বাধা দেবে।

import shutil

import requests

url = 'http://example.com/img.png'
response = requests.get(url, stream=True)
with open('img.png', 'wb') as out_file:
    shutil.copyfileobj(response.raw, out_file)
del response

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

আমি তারপর অনুরোধ মডিউল লেখক দ্বারা প্রস্তাবিত উপায় চেষ্টা:

import requests
from PIL import Image
from StringIO import StringIO

r = requests.get('https://example.com/image.jpg')
i = Image.open(StringIO(r.content))

এই অনেক ফাংশন কল সংখ্যা কমে, এইভাবে আমার আবেদন দ্রুত গতি। এখানে আমার প্রোফাইলার কোড এবং ফলাফল।

#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile

def testRequest():
    image_name = 'test1.jpg'
    url = 'http://example.com/image.jpg'

    r = requests.get(url, stream=True)
    with open(image_name, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)

def testRequest2():
    image_name = 'test2.jpg'
    url = 'http://example.com/image.jpg'

    r = requests.get(url)

    i = Image.open(StringIO(r.content))
    i.save(image_name)

if __name__ == '__main__':
    profile.run('testUrllib()')
    profile.run('testUrllib2()')
    profile.run('testRequest()')

TestRequest ফলাফল:

343080 function calls (343068 primitive calls) in 2.580 seconds

এবং testRequest2 এর ফলাফল:

3129 function calls (3105 primitive calls) in 0.024 seconds

আমি একটি উত্তর পোস্ট করতে যাচ্ছি কারণ আমার কোনও মন্তব্য করার জন্য যথেষ্ট সংখ্যক প্রতিলিপি নেই, কিন্তু BlairG23 দ্বারা পোস্ট করা Wget এর সাথে, আপনি পথের জন্য একটি বাহ্যিক প্যারামিটারও সরবরাহ করতে পারেন।

 wget.download(url, out=path)

এই requests ব্যবহার করা চেয়ে সহজ হতে পারে। এটি হ'ল একমাত্র সময় যা আমি HTTP স্টাফ করার requests ব্যবহার না করার পরামর্শ দেব।

urllib ব্যবহার করে দুটি মাছ ধরার নৌকা:

>>> import urllib
>>> urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

wget নামে একটি চমৎকার পাইথন মডিউল রয়েছে যা ব্যবহার করা খুব সহজ। here পাওয়া here

এই নকশা সরলতা প্রদর্শন করে:

>>> import wget
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
>>> filename = wget.download(url)
100% [................................................] 3841532 / 3841532>
>> filename
'razorback.mp3'

উপভোগ করুন।

সম্পাদনা: আপনি একটি পথ উল্লেখ করতে একটি বাহ্যিক প্যারামিটার যোগ করতে পারেন।

>>> out_filepath = <output_filepath>    
>>> filename = wget.download(url, out=out_filepath)

এই সম্পর্কে, একটি দ্রুত সমাধান।

import requests

url = "http://craphound.com/images/1006884_2adf8fc7.jpg"
response = requests.get(url)
if response.status_code == 200:
    with open("/Users/apple/Desktop/sample.jpg", 'wb') as f:
        f.write(response.content)

নিম্নলিখিত কোড স্নিপেট একটি ফাইল ডাউনলোড।

ফাইল নির্দিষ্ট ফাইলের মধ্যে তার ফাইলের নাম দিয়ে সংরক্ষণ করা হয়।

import requests

url = "http://beispiel.dort/ichbineinbild.jpg"
filename = url.split("/")[-1]
r = requests.get(url, timeout=0.5)

if r.status_code == 200:
    with open(filename, 'wb') as f:
        f.write(r.content)

যখন আমি নিচের কোডটি চালানোর চেষ্টা করি, ছবিটি ডাউনলড করা হচ্ছে তবে আকারটি সর্বদা 34 কেবি পর্যন্ত সীমিত।

import requests
import shutil

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
    r.raw.decode_content = True
    shutil.copyfileobj(r.raw, f)  

এবং আসলো দয়া করে আমাকে কীভাবে সেটিংস জানাতে হবে। STATICMAP_URL.format (** ডেটা), আমি সেটিংসের জায়গায় আমার ইউএসএল ব্যবহার করছি। STATICMAP_URL.format (** ডেটা)





python-requests