Төменде 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 мекенжайларының тізімін «Әдемі сорпа» арқылы қырып алудан гөрі ережелерге сәйкес жасау оңайырақ (төменде қараңыз).
Тізімді түсіну белгісін пайдаланыңыз.
- Қатысты мақалалар:Python тізімін түсіну белгілерін пайдалану
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 жолының пішім әдісі туралы қосымша ақпарат алу үшін келесі мақаланы қараңыз.
- Қатысты мақалалар:Python-да форматты түрлендіру, пішім (нөлдік толтыру, экспоненциалды белгілеу, он алтылық және т.б.)
Сондай-ақ, бұл жерде біз шығысты оқуды жеңілдету үшін 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() пайдаланамын. Бірлік секундтарда, сондықтан жоғарыдағы мысалда уақыт модулі импортталады және пайдаланылады.
Мысал кескін файлдарына арналған, бірақ олар тізімде болса, файлдардың басқа түрлерін бірге жүктеп алуға болады.