पाइथनमा वेबबाट छविहरू र अन्य फाइलहरू डाउनलोड गर्नुहोस् (व्यक्तिगत रूपमा वा ब्याचहरूमा)

व्यापार

निम्नले पाइथनमा वेबमा छवि, ZIP, PDF, वा अन्य फाइलको URL कसरी निर्दिष्ट गर्ने, यसलाई डाउनलोड गर्ने र स्थानीय फाइलको रूपमा बचत गर्ने भनेर वर्णन गर्दछ।

  • URL निर्दिष्ट गरेर छविहरू डाउनलोड गर्नुहोस्।
    • कोड उदाहरण
    • urllib.request.urlopen():URL खोल्नुहोस्
    • open():बाइनरी मोडमा फाइलमा लेख्नुहोस्
    • एक सरल कोड उदाहरण
  • ZIP फाइलहरू, PDF फाइलहरू, आदि डाउनलोड गर्नुहोस्।
  • वेब पृष्ठमा छविको URL निकाल्नुहोस्।
    • यदि संख्या क्रमिक छ
    • सुन्दर सूपको साथ निकाल्नुहोस्
  • ब्याच URL को सूचीबाट धेरै छविहरू डाउनलोड गर्नुहोस्

URL निर्दिष्ट गरेर छविहरू डाउनलोड गर्नुहोस्।

तपाईले मानक पुस्तकालय प्रयोग गर्न सक्नुहुनेछ व्यक्तिगत फाइलहरू डाउनलोड गर्नका लागि तिनीहरूको URL निर्दिष्ट गरेर; कुनै अतिरिक्त स्थापना आवश्यक छैन।

कोड उदाहरण

URL र गन्तव्य मार्ग, र यसको उपयोग निर्दिष्ट गरेर फाइल डाउनलोड र बचत गर्ने प्रकार्यको उदाहरण निम्न हो। यो कोड स्पष्टीकरण को लागी अलि verbose छ। एक साधारण उदाहरण तल दिइएको छ।

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 खोल्नुहोस्

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() बाट प्राप्त गर्न सकिने डाटा बाइट स्ट्रिङ (बाइट प्रकार) हो।

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)

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-अङ्कको शून्य-भरिएको अनुक्रमिक संख्याको लागि प्रयोग गरिन्छ; {} प्रयोग गरिन्छ जब शून्य-भरण आवश्यक छैन, र {:05} 3 अंकको सट्टा 5-अङ्कको संख्याको लागि प्रयोग गरिन्छ। string str को ढाँचा विधि ’bout थप जानकारीको लागि, निम्न लेख हेर्नुहोस्।

साथै, यहाँ हामी आउटपुट पढ्न सजिलो बनाउन pprint प्रयोग गर्दैछौं।

सुन्दर सूपको साथ निकाल्नुहोस्

बल्कमा वेब पृष्ठहरूबाट छवि URL हरू निकाल्न, सुन्दर सूप प्रयोग गर्नुहोस्।

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

from bs4 import BeautifulSoup

url = 'https://ne.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 देखाइएको फाइल डाउनलोड गर्न र बचत गर्न प्रकार्यलाई कल गर्न सक्नुहुन्छ। अस्थायी 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