পাইথনে ওয়েব থেকে ছবি এবং অন্যান্য ফাইল ডাউনলোড করুন (ব্যক্তিগতভাবে বা ব্যাচে)

ব্যবসায়

পাইথনে ওয়েবে একটি ইমেজ, জিপ, পিডিএফ, বা অন্য ফাইলের URL কীভাবে নির্দিষ্ট করতে হয়, এটি ডাউনলোড করতে এবং স্থানীয় ফাইল হিসাবে সংরক্ষণ করতে হয় তা নিম্নলিখিতটি ব্যাখ্যা করে।

  • URL উল্লেখ করে ছবি ডাউনলোড করুন।
    • কোড উদাহরণ
    • urllib.request.urlopen():URL খুলুন
    • open():বাইনারি মোডে একটি ফাইল লিখুন
    • একটি সহজ কোড উদাহরণ
  • জিপ ফাইল, পিডিএফ ফাইল ইত্যাদি ডাউনলোড করুন।
  • ওয়েব পেজে ইমেজের URL বের করুন।
    • সংখ্যাটি ক্রমিক হলে
    • সুন্দর স্যুপ সঙ্গে নির্যাস
  • ইউআরএলের একটি তালিকা থেকে ব্যাচ একাধিক ছবি ডাউনলোড করুন

URL উল্লেখ করে ছবি ডাউনলোড করুন।

আপনি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করতে পারেন শুধুমাত্র পৃথক ফাইল ডাউনলোড করতে তাদের URL উল্লেখ করে; কোন অতিরিক্ত ইনস্টলেশন প্রয়োজন হয় না.

কোড উদাহরণ

নিম্নলিখিত একটি ফাংশনের উদাহরণ যা URL এবং গন্তব্য পথ এবং এর ব্যবহার নির্দিষ্ট করে একটি ফাইল ডাউনলোড এবং সংরক্ষণ করে। ব্যাখ্যার খাতিরে এই কোডটি একটু ভার্বোস। একটি সহজ উদাহরণ নীচে দেওয়া হয়.

import os
import pprint
import time
import urllib.error
import urllib.request

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file:
            data = web_file.read()
            with open(dst_path, mode='wb') as local_file:
                local_file.write(data)
    except urllib.error.URLError as e:
        print(e)
url = 'https://www.python.org/static/img/python-logo.png'
dst_path = 'data/temp/py-logo.png'
download_file(url, dst_path)

গন্তব্য ডিরেক্টরি নির্দিষ্ট করতে এবং URL ফাইলের নামের সাথে ফাইলটি সংরক্ষণ করতে, নিম্নলিখিতটি করুন

def download_file_to_dir(url, dst_dir):
    download_file(url, os.path.join(dst_dir, os.path.basename(url)))

dst_dir = 'data/temp'
download_file_to_dir(url, dst_dir)

এটি URL থেকে os.path.basename() দিয়ে ফাইলের নাম বের করে এবং গন্তব্য পথ তৈরি করতে os.path.join() এর সাথে নির্দিষ্ট ডিরেক্টরির সাথে যোগ দেয়।

নিম্নলিখিত বিভাগগুলি ডেটা অধিগ্রহণের অংশ এবং ফাইল হিসাবে ডেটা সংরক্ষণের অংশ বর্ণনা করে।

urllib.request.urlopen():URL খুলুন

ইউআরএল খুলতে এবং ডেটা পুনরুদ্ধার করতে urllib.request.urlopen() ব্যবহার করুন। উল্লেখ্য যে urllib.urlopen() Python 2.6 এবং তার আগে অবচয় করা হয়েছে। urllib.request.urlretrieve() এখনও অবমূল্যায়ন করা হয়নি, তবে ভবিষ্যতে হতে পারে।

একটি ব্যতিক্রম ঘটলে থামানো এড়াতে, চেষ্টা করুন এবং ছাড়া ত্রুটিটি ধরুন।

উদাহরণে, urllib.error আমদানি করা হয়েছে এবং শুধুমাত্র urllib.error.URLError স্পষ্টভাবে ক্যাপচার করা হয়েছে। ফাইলের URL বিদ্যমান না থাকলে ত্রুটি বার্তাটি প্রদর্শিত হবে।

url_error = 'https://www.python.org/static/img/python-logo_xxx.png'
download_file_to_dir(url_error, dst_dir)
# HTTP Error 404: Not Found

আপনি স্থানীয়ভাবে সংরক্ষণ করার সময় ব্যতিক্রমগুলি (FileNotFoundError, ইত্যাদি) ধরতে চাইলে, নিম্নলিখিতগুলি করুন৷
(urllib.error.URLError, FileNotFoundError)

ইউআরএল খুলতে এবং ডেটা পেতে স্ট্যান্ডার্ড লাইব্রেরি urllib-এর পরিবর্তে তৃতীয় পক্ষের লাইব্রেরি অনুরোধগুলি ব্যবহার করাও সম্ভব।

Open() এ বাইনারি মোডে একটি ফাইলে লিখুন

urllib.request.urlopen() দিয়ে যে ডেটা পাওয়া যায় তা হল একটি বাইট স্ট্রিং (বাইট টাইপ)।

Open() with mode=’wb’ দ্বিতীয় আর্গুমেন্ট হিসেবে ডাটাকে বাইনারি হিসেবে লেখে। w মানে লেখা এবং b মানে বাইনারি।

একটি সহজ কোড উদাহরণ

স্টেটমেন্ট সহ নেস্টেড কমা দিয়ে আলাদা করে একবারে লেখা যেতে পারে।

এটি ব্যবহার করে, আমরা নিম্নলিখিত লিখতে পারি।

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file, open(dst_path, 'wb') as local_file:
            local_file.write(web_file.read())
    except urllib.error.URLError as e:
        print(e)

জিপ ফাইল, পিডিএফ ফাইল ইত্যাদি ডাউনলোড করুন।

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

আপনি URL উল্লেখ করে ফাইল ডাউনলোড এবং সংরক্ষণ করতে পারেন।

url_zip = 'https://from-locas.com/sample_header.csv.zip'
download_file_to_dir(url_zip, dst_dir)

url_xlsx = 'https://from-locas/sample.xlsx'
download_file_to_dir(url_xlsx, dst_dir)

url_pdf = 'https://from-locas/sample1.pdf'
download_file_to_dir(url_pdf, dst_dir)

মনে রাখবেন যে এই ফাংশনে নির্দিষ্ট করা URLটি অবশ্যই ফাইলের একটি লিঙ্ক হতে হবে।

উদাহরণস্বরূপ, একটি GitHub সংগ্রহস্থল ফাইলের ক্ষেত্রে, নিম্নলিখিত URL এর একটি pdf এক্সটেনশন আছে কিন্তু আসলে এটি একটি html পৃষ্ঠা। যদি উপরের ফাংশনে এই URLটি নির্দিষ্ট করা থাকে, তাহলে html উৎস ডাউনলোড করা হবে।

  • https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf

ফাইল সত্তার লিঙ্কটি হল নিম্নলিখিত URL, যা আপনি ফাইলটি ডাউনলোড এবং সংরক্ষণ করতে চাইলে আপনাকে নির্দিষ্ট করতে হবে৷

  • https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf

এমন কিছু ক্ষেত্রেও রয়েছে যেখানে ব্যবহারকারী এজেন্ট, রেফারার ইত্যাদি দ্বারা অ্যাক্সেস সীমাবদ্ধ করা হয়েছে, যা ডাউনলোড করা অসম্ভব করে তোলে। আমরা গ্যারান্টি দিই না যে সমস্ত ফাইল ডাউনলোড করা হবে।

ব্যবহারকারী এজেন্টের মতো অনুরোধ শিরোনাম পরিবর্তন বা যোগ করার জন্য অনুরোধগুলি ব্যবহার করা সহজ।

ওয়েব পেজে ইমেজের URL বের করুন।

একবারে একটি পৃষ্ঠায় সমস্ত ছবি ডাউনলোড করতে, প্রথমে চিত্রগুলির URL গুলি বের করুন এবং একটি তালিকা তৈরি করুন।

সংখ্যাটি ক্রমিক হলে

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

তালিকা বোঝার স্বরলিপি ব্যবহার করুন।

url_list = ['https://example.com/basedir/base_{:03}.jpg'.format(i) for i in range(5)]
pprint.pprint(url_list)
# ['https://example.com/basedir/base_000.jpg',
#  'https://example.com/basedir/base_001.jpg',
#  'https://example.com/basedir/base_002.jpg',
#  'https://example.com/basedir/base_003.jpg',
#  'https://example.com/basedir/base_004.jpg']

উপরের উদাহরণে, 3-অঙ্কের শূন্য-পূর্ণ অনুক্রমিক সংখ্যার জন্য {:03} ব্যবহার করা হয়েছে; {} ব্যবহার করা হয় যখন শূন্য-ভর্তি প্রয়োজন হয় না, এবং {:05} 3 সংখ্যার পরিবর্তে 5-অঙ্কের সংখ্যার জন্য ব্যবহার করা হয়। স্ট্রিং str এর বিন্যাস পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত নিবন্ধটি দেখুন।

এছাড়াও, এখানে আমরা আউটপুট পড়া সহজ করতে pprint ব্যবহার করছি।

সুন্দর স্যুপ সঙ্গে নির্যাস

বাল্ক ওয়েব পৃষ্ঠাগুলি থেকে ছবির URL গুলি বের করতে, Beautiful Soup ব্যবহার করুন৷

import os
import time
import urllib.error
import urllib.request

from bs4 import BeautifulSoup

url = 'https://bn.from-locals.com/'
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Chrome/55.0.2883.95 Safari/537.36 '

req = urllib.request.Request(url, headers={'User-Agent': ua})
html = urllib.request.urlopen(req)

soup = BeautifulSoup(html, "html.parser")

url_list = [img.get('data-src') for img in soup.find(class_='list').find_all('img')]

উদাহরণে, এই ওয়েবসাইটের থাম্বনেল ছবির URL বের করা হয়েছে।

গঠন ওয়েব পৃষ্ঠার উপর নির্ভর করে পরিবর্তিত হয়, কিন্তু মূলত এটি নিম্নরূপ প্রাপ্ত হয়.

  • একটি তালিকা পান <img> আপনি যে একাধিক ছবি ডাউনলোড করতে চান সেই ব্লকের ক্লাস, আইডি ইত্যাদি উল্লেখ করে অবজেক্ট ট্যাগ করুন।
    • soup.find(class_='list').find_all('img')
  • <img>-এর src উপাদান বা data-src উপাদান থেকে ছবির URL প্রাপ্ত করুন। ট্যাগ
    • img.get('data-src')

উপরের নমুনা কোডটি শুধুমাত্র একটি উদাহরণ এবং কাজ করার নিশ্চয়তা নেই।

ইউআরএলের একটি তালিকা থেকে ব্যাচ একাধিক ছবি ডাউনলোড করুন

যদি আপনার কাছে URL-এর একটি তালিকা থাকে, তাহলে আপনি এটিকে একটি লুপে চালু করতে পারেন এবং দেখানো প্রথম URL সহ ফাইলটি ডাউনলোড ও সংরক্ষণ করতে ফাংশনটিকে কল করতে পারেন৷ অস্থায়ী URL তালিকার কারণে, ফাংশন কল download_image_dir() এখানে মন্তব্য করা হয়েছে।

download_dir = 'data/temp'
sleep_time_sec = 1

for url in url_list:
    print(url)
#     download_file_dir(url, download_dir)
    time.sleep(sleep_time_sec)
# https://example.com/basedir/base_000.jpg
# https://example.com/basedir/base_001.jpg
# https://example.com/basedir/base_002.jpg
# https://example.com/basedir/base_003.jpg
# https://example.com/basedir/base_004.jpg

সার্ভার ওভারলোড না করার জন্য, আমি প্রতিটি ছবি ডাউনলোডের জন্য একটি অপেক্ষার সময় তৈরি করতে time.sleep() ব্যবহার করি। ইউনিটটি সেকেন্ডে, তাই উপরের উদাহরণে, সময় মডিউলটি আমদানি করা হয় এবং ব্যবহার করা হয়।

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

Copied title and URL