Python मध्ये वेबवरून प्रतिमा आणि इतर फाइल्स डाउनलोड करा (वैयक्तिकरित्या किंवा बॅचमध्ये)

व्यवसाय

Python मध्ये वेबवरील इमेज, ZIP, PDF किंवा इतर फाइलची URL कशी निर्दिष्ट करायची, ती डाउनलोड करायची आणि स्थानिक फाइल म्हणून सेव्ह कशी करायची हे खाली स्पष्ट केले आहे.

  • URL निर्दिष्ट करून प्रतिमा डाउनलोड करा.
    • कोड उदाहरण
    • urllib.request.urlopen():URL उघडा
    • open():बायनरी मोडमध्ये फाइलवर लिहा
    • एक साधे कोड उदाहरण
  • ZIP फाइल्स, PDF फाइल्स इ. डाउनलोड करा.
  • वेब पृष्ठावरील प्रतिमेची URL काढा.
    • जर संख्या अनुक्रमिक असेल
    • सुंदर सूप सह अर्क
  • 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 उघडा

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)

url उघडण्यासाठी आणि डेटा मिळविण्यासाठी मानक लायब्ररी urllib ऐवजी तृतीय-पक्ष लायब्ररी विनंत्या वापरणे देखील शक्य आहे.

ओपन () मध्ये बायनरी मोडमध्ये फाइलवर लिहा

urllib.request.urlopen() सह मिळवता येणारा डेटा एक बाइट स्ट्रिंग (बाइट प्रकार) आहे.

ओपन() मोड=’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)

ZIP फाइल्स, PDF फाइल्स इ. डाउनलोड करा.

आत्तापर्यंतची उदाहरणे इमेज फाइल्स डाऊनलोड आणि सेव्ह करण्यासाठी आहेत, परंतु आम्ही वेबवर फाइल उघडून स्थानिक फाइल म्हणून सेव्ह करत असल्यामुळे, तीच फंक्शन्स इतर प्रकारच्या फाइल्ससाठी वापरली जाऊ शकतात.

तुम्ही 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 फक्त अनुक्रमिक संख्या नसतील तर काही नियमितता देखील असेल तर, सुंदर सूप (खाली पहा) स्क्रॅप करण्याऐवजी नियमांनुसार 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-अंकी शून्य-भरलेल्या अनुक्रमिक संख्येसाठी वापरले जाते; जेव्हा शून्य भरणे आवश्यक नसते तेव्हा {} वापरले जाते आणि 3 अंकांऐवजी 5-अंकी संख्येसाठी {:05} वापरले जाते. स्ट्रिंग str च्या फॉरमॅट पद्धतीबद्दल अधिक माहितीसाठी, खालील लेख पहा.

तसेच, आउटपुट वाचणे सोपे करण्यासाठी येथे आम्ही pprint वापरत आहोत.

सुंदर सूप सह अर्क

मोठ्या प्रमाणात वेब पृष्ठांमधून प्रतिमा URL काढण्यासाठी, सुंदर सूप वापरा.

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

from bs4 import BeautifulSoup

url = 'https://mr.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 घटक किंवा डेटा-src घटकावरून प्रतिमेची URL मिळवा. टॅग
    • img.get('data-src')

वरील नमुना कोड फक्त एक उदाहरण आहे आणि कार्य करण्याची हमी नाही.

URL च्या सूचीमधून बॅच एकाधिक प्रतिमा डाउनलोड करा

तुमच्याकडे 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