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() әлі ескірген жоқ, бірақ болашақта болуы мүмкін.

Ерекшелік орын алған кезде тоқтауды болдырмау үшін, try және except арқылы қатені ұстаңыз.

Мысалда 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 орнына үшінші тарап кітапханасының сұрауларын пайдалануға болады.

Open() файлына екілік режимде жазу

urllib.request.urlopen() арқылы алуға болатын деректер байт жолы болып табылады (байт түрі).

Open() режимі=’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 таңбалы сан үшін қолданылады. str жолының пішім әдісі туралы қосымша ақпарат алу үшін келесі мақаланы қараңыз.

Сондай-ақ, бұл жерде біз шығысты оқуды жеңілдету үшін pprint пайдаланамыз.

Әдемі сорпа қосылған сығынды

Веб-беттерден суреттің URL мекенжайларын жаппай алу үшін Әдемі сорпаны пайдаланыңыз.

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

from bs4 import BeautifulSoup

url = 'https://kk.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')
  • Кескіннің URL мекенжайын <img> src элементінен немесе data-src элементінен алыңыз; тег.
    • img.get('data-src')

Жоғарыда келтірілген үлгі коды тек мысал және жұмыс істеуге кепілдік бермейді.

URL мекенжайларының тізімінен бірнеше суретті пакеттік жүктеп алыңыз

Егер сізде URL мекенжайларының тізімі болса, оны тек for цикліне айналдырып, файлды жүктеп алу және бірінші көрсетілген 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