இணையத்திலிருந்து படங்கள் மற்றும் பிற கோப்புகளை பைத்தானில் பதிவிறக்கவும் (தனியாக அல்லது தொகுப்பாக)

வணிக

படம், ஜிப், பிடிஎஃப் அல்லது இணையத்தில் உள்ள பிற கோப்பின் 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() ஐப் பயன்படுத்தவும். Python 2.6 மற்றும் அதற்கு முந்தையவற்றில் urllib.urlopen() நீக்கப்பட்டது என்பதை நினைவில் கொள்ளவும். 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() with 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-இலக்க பூஜ்ஜியம் நிரப்பப்பட்ட வரிசை எண்ணுக்குப் பயன்படுத்தப்படுகிறது; பூஜ்ஜிய நிரப்புதல் தேவையில்லாதபோது {} பயன்படுத்தப்படுகிறது, மேலும் 3 இலக்கங்களுக்குப் பதிலாக 5 இலக்க எண்ணுக்கு {:05} பயன்படுத்தப்படுகிறது. string str இன் வடிவமைப்பு முறையைப் பற்றிய கூடுதல் தகவலுக்கு, பின்வரும் கட்டுரையைப் பார்க்கவும்.

மேலும், வெளியீட்டை எளிதாகப் படிக்க இங்கே pprint ஐப் பயன்படுத்துகிறோம்.

அழகான சூப்புடன் பிரித்தெடுக்கவும்

மொத்தமாக இணையப் பக்கங்களிலிருந்து பட URLகளைப் பிரித்தெடுக்க, அழகான சூப்பைப் பயன்படுத்தவும்.

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

from bs4 import BeautifulSoup

url = 'https://ta.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() ஐப் பயன்படுத்துகிறேன். அலகு நொடிகளில் உள்ளது, எனவே மேலே உள்ள எடுத்துக்காட்டில், நேர தொகுதி இறக்குமதி செய்யப்பட்டு பயன்படுத்தப்படுகிறது.

உதாரணம் படக் கோப்புகளுக்கானது, ஆனால் மற்ற வகை கோப்புகள் பட்டியலிடப்பட்டிருக்கும் வரை ஒன்றாகவும் பதிவிறக்கம் செய்யப்படலாம்.