কম্পিউটার টিউটোরিয়াল

পাইথনে অনুরোধ লাইব্রেরি ব্যবহার করে ওয়েব থেকে ফাইল ডাউনলোড করা


পাইথন urllib, requests ইত্যাদি বিভিন্ন মডিউল প্রদান করে ওয়েব থেকে ফাইল ডাউনলোড করার জন্য। আমি পাইথনের requests লাইব্রেরি ব্যবহার করে URL থেকে দক্ষতার সাথে ফাইল ডাউনলোড করব।

Requests লাইব্রেরি ব্যবহার করে URL থেকে ফাইল ডাউনলোড করার ধাপে ধাপে প্রক্রিয়াটি নিচে দেওয়া হলো:

১. মডিউল আমদানি করুন

import requests

২. লিংক বা URL পান

url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)

৩. নাম দিয়ে কন্টেন্ট সংরক্ষণ করুন

open('facebook.ico', 'wb').write(r.content)

ফাইলটি facebook.ico হিসেবে সংরক্ষণ হবে।

উদাহরণ

import requests
url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
open('facebook.ico', 'wb').write(r.content)

ফলাফল

পাইথনে অনুরোধ লাইব্রেরি ব্যবহার করে ওয়েব থেকে ফাইল ডাউনলোড করা

আমরা বর্তমান ওয়ার্কিং ডিরেক্টরিতে ডাউনলোড করা ফাইল (আইকন) দেখতে পাচ্ছি।

তবে আমাদের ওয়েব থেকে চিত্র, টেক্সট, ভিডিও ইত্যাদি বিভিন্ন ধরনের ফাইল ডাউনলোড করতে হতে পারে। তাই প্রথমে URL কী ধরনের ডেটা লিংক করছে তা জানা যাক:

>>> r = requests.get(url, allow_redirects=True)
>>> print(r.headers.get('content-type'))
image/png

তবে একটি চমৎকার উপায় হলো শুধু হেডার ফেচ করে আসা, আসলে ডাউনলোড করার আগে। এটি আমাদের সেসব ফাইল ডাউনলোড করতে না দেবে যেগুলো ডাউনলোডের জন্য নয়।

>>> print(is_downloadable('https://www.youtube.com/watch?v=xCglV_dqFGI'))
False
>>> print(is_downloadable('https://www.facebook.com/favicon.ico'))
True

ফাইল সাইজ দ্বারা ডাউনলোড সীমাবদ্ধ করতে, content-length হেডার থেকে ফাইল সাইজ পেয়ে প্রয়োজনমতো কাজ করা যায়।

contentLength = header.get('content-length', None)
if contentLength and contentLength > 2e8:  # ২০০ এমবি প্রায়
    return False

URL থেকে ফাইলনেম পান

ফাইলনেম পেতে URL পার্স করতে পারি। নিচে একটি নমুনা রুটিন দেওয়া হলো যা ব্যাকস্ল্যাশ (/) এর পরে শেষ স্ট্রিং ফেচ করে।

url = "https://www.computersolution.tech/wp-content/uploads/2016/05/tutorialspoint-logo.png"
if url.find('/'):
    print(url.rsplit('/', 1)[1]

উপরোক্ত কোড URL থেকে ফাইলনেম দেবে। কিন্তু অনেক ক্ষেত্রে URL-এ ফাইলনেমের তথ্য থাকে না, যেমন - https://url.com/download। সেক্ষেত্রে Content-Disposition হেডার থেকে ফাইলনেম পেতে হয়।

import requests
import re

def getFilename_fromCd(cd):
    """Get filename from content-disposition"""
    if not cd:
        return None
    fname = re.findall('filename=(.+)', cd)
    if len(fname) == 0:
        return None
    return fname[0]

url = 'https://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
filename = getFilename_fromCd(r.headers.get('content-disposition'))
open(filename, 'wb').write(r.content)

উপরোক্ত URL-পার্সিং কোড এবং প্রোগ্রামের সংযোগে আপনি অধিকাংশ সময় Content-Disposition হেডার থেকে ফাইলনেম পাবেন।


  1. পাইথনে lxml ব্যবহার করে ওয়েব স্ক্র্যাপিং বাস্তবায়ন

  2. পাইথন এবং Scrapy দিয়ে ওয়েব স্ক্রেপিং

  3. পাইথনে lxml ব্যবহার করে ওয়েব স্ক্র্যাপিং বাস্তবায়ন

  4. পাইথনে একসাথে একাধিক ফাইল রিনেম করা