Python میں ویب سے تصاویر اور دیگر فائلیں ڈاؤن لوڈ کریں (انفرادی طور پر یا بیچوں میں)

کاروبار

مندرجہ ذیل وضاحت کرتا ہے کہ Python میں ویب پر کسی تصویر، ZIP، PDF، یا دوسری فائل کے URL کی وضاحت کیسے کی جائے، اسے ڈاؤن لوڈ کریں، اور اسے مقامی فائل کے طور پر محفوظ کریں۔

  • URL کی وضاحت کرکے تصاویر ڈاؤن لوڈ کریں۔
    • کوڈ کی مثال
    • urllib.request.urlopen():URL کھولیں۔
    • open():بائنری موڈ میں فائل پر لکھیں۔
    • ایک آسان کوڈ کی مثال
  • زپ فائلز، پی ڈی ایف فائلیں وغیرہ ڈاؤن لوڈ کریں۔
  • ویب صفحہ پر تصویر کا URL نکالیں۔
    • اگر نمبر ترتیب وار ہے۔
    • خوبصورت سوپ کے ساتھ نکالیں۔
  • بیچ یو آر ایل کی فہرست سے متعدد تصاویر ڈاؤن لوڈ کریں۔

URL کی وضاحت کرکے تصاویر ڈاؤن لوڈ کریں۔

آپ معیاری لائبریری کا استعمال صرف انفرادی فائلوں کو ان کے URLs کی وضاحت کر کے ڈاؤن لوڈ کرنے کے لیے کر سکتے ہیں۔ کوئی اضافی تنصیب کی ضرورت نہیں ہے.

کوڈ کی مثال

مندرجہ ذیل ایک فنکشن کی ایک مثال ہے جو یو آر ایل اور منزل کے راستے اور اس کے استعمال کی وضاحت کرکے فائل کو ڈاؤن لوڈ اور محفوظ کرتا ہے۔ یہ کوڈ وضاحت کی خاطر تھوڑا سا لفظی ہے۔ ایک سادہ سی مثال ذیل میں دی گئی ہے۔

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)

یہ os.path.basename() کے ساتھ URL سے فائل کا نام نکالتا ہے اور منزل کا راستہ بنانے کے لیے اسے 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 کی بجائے تھرڈ پارٹی لائبریری کی درخواستیں استعمال کرنا بھی ممکن ہے۔

اوپن() میں بائنری موڈ میں فائل پر لکھیں

ڈیٹا جو urllib.request.urlopen() کے ساتھ حاصل کیا جا سکتا ہے ایک بائٹ سٹرنگ (بائٹس کی قسم) ہے۔

Open() 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_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 کو خود فائل کا لنک ہونا چاہیے۔

مثال کے طور پر، گٹ ہب ریپوزٹری فائل کی صورت میں، درج ذیل یو آر ایل میں پی ڈی ایف ایکسٹینشن ہے لیکن دراصل ایک HTML صفحہ ہے۔ اگر یہ یو آر ایل اوپر دیے گئے فنکشن میں بیان کیا گیا ہے، تو HTML سورس ڈاؤن لوڈ ہو جائے گا۔

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

فائل ہستی کا لنک درج ذیل یو آر ایل ہے، جسے آپ کو بتانا ہوگا اگر آپ فائل کو ڈاؤن لوڈ اور محفوظ کرنا چاہتے ہیں۔

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

ایسے معاملات بھی ہیں جہاں صارف ایجنٹ، حوالہ دینے والے وغیرہ کے ذریعہ رسائی پر پابندی ہے، جس سے اسے ڈاؤن لوڈ کرنا ناممکن ہو جاتا ہے۔ ہم اس بات کی ضمانت نہیں دیتے کہ تمام فائلیں ڈاؤن لوڈ ہو جائیں گی۔

درخواست کے ہیڈر جیسے صارف ایجنٹ کو تبدیل کرنے یا شامل کرنے کی درخواستوں کا استعمال کرنا آسان ہے۔

ویب صفحہ پر تصویر کا 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']

مندرجہ بالا مثال میں، {:03} 3 ہندسوں کے صفر سے بھرے ترتیب وار نمبر کے لیے استعمال ہوتا ہے۔ {} استعمال کیا جاتا ہے جب صفر بھرنا ضروری نہ ہو، اور {:05} کو 3 ہندسوں کی بجائے 5 ہندسوں کے نمبر کے لیے استعمال کیا جاتا ہے۔ سٹرنگ str کے فارمیٹ طریقہ کے بارے میں مزید معلومات کے لیے، درج ذیل مضمون کو دیکھیں۔

اس کے علاوہ، یہاں ہم آؤٹ پٹ کو پڑھنے میں آسان بنانے کے لیے pprint کا استعمال کر رہے ہیں۔

خوبصورت سوپ کے ساتھ نکالیں۔

بڑی تعداد میں ویب صفحات سے تصویری یو آر ایل نکالنے کے لیے، بیوٹیفل سوپ استعمال کریں۔

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

from bs4 import BeautifulSoup

url = 'https://ur.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')

مندرجہ بالا نمونہ کوڈ صرف ایک مثال ہے اور کام کرنے کی ضمانت نہیں ہے۔

بیچ یو آر ایل کی فہرست سے متعدد تصاویر ڈاؤن لوڈ کریں۔

اگر آپ کے پاس URLs کی فہرست ہے، تو آپ اسے صرف ایک لوپ میں تبدیل کر سکتے ہیں اور پہلے دکھائے گئے 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