পাইথন 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 হেডার থেকে ফাইলনেম পাবেন।