У наставку је објашњено како да наведете УРЛ слике, ЗИП-а, ПДФ-а или друге датотеке на Вебу у Питхон-у, преузмете је и сачувате као локалну датотеку.
- Преузмите слике тако што ћете навести УРЛ.
- Пример кода
urllib.request.urlopen()
:Отвори УРЛopen()
:Пишите у датотеку у бинарном режиму- Једноставнији пример кода
- Преузмите ЗИП датотеке, ПДФ датотеке итд.
- Извуците УРЛ слике на веб страници.
- Ако је број секвенцијалан
- Екстракт са прелепом супом
- Групно преузимање више слика са листе УРЛ адреса
Преузмите слике тако што ћете навести УРЛ.
Стандардну библиотеку можете користити само за преузимање појединачних датотека тако што ћете навести њихове УРЛ адресе; није потребна додатна инсталација.
Пример кода
Следи пример функције која преузима и чува датотеку навођењем УРЛ адресе и одредишне путање и њене употребе. Овај код је мало опсежан ради објашњења. Једноставан пример је дат у наставку.
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)
Да бисте одредили одредишни директоријум и сачували датотеку са именом УРЛ датотеке, урадите следеће
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)
Извлачи име датотеке из УРЛ-а помоћу ос.патх.басенаме() и спаја га са директоријумом наведеним са ос.патх.јоин() да би генерисала одредишну путању.
Следећи одељци описују део аквизиције података и део чувања података као датотеке.
urllib.request.urlopen():Отвори УРЛ
Користите урллиб.рекуест.урлопен() да отворите УРЛ и преузмете податке. Имајте на уму да је урллиб.урлопен() застарео у Питхон-у 2.6 и раније. урллиб.рекуест.урлретриеве() још увек није застарео, али ће можда бити у будућности.
Да бисте избегли заустављање када дође до изузетка, ухватите грешку помоћу покушаја и осим.
У примеру, урллиб.еррор је увезен и само урллиб.еррор.УРЛЕррор је експлицитно снимљен. Порука о грешци ће се приказати када УРЛ датотеке не постоји.
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
Ако желите да ухватите и изузетке (ФилеНотФоундЕррор, итд.) приликом локалног чувања, урадите следеће.(urllib.error.URLError, FileNotFoundError)
Такође је могуће користити библиотечке захтеве треће стране уместо стандардне библиотеке урллиб да бисте отворили урл и добили податке.
Упишите у датотеку у бинарном режиму у опен()
Подаци који се могу добити помоћу урллиб.рекуест.урлопен() је низ бајтова (тип бајтова).
Опен() са моде=’вб’ као другим аргументом записује податке као бинарне. в значи писање и б значи бинарно.
Једноставнији пример кода
Угнежђени искази могу се писати одједном, одвојени зарезима.
Користећи ово, можемо написати следеће.
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)
Преузмите ЗИП датотеке, ПДФ датотеке итд.
Досадашњи примери су за преузимање и чување сликовних датотека, али пошто једноставно отварамо датотеку на вебу и чувамо је као локалну датотеку, исте функције се могу користити за друге типове датотека.
Можете преузети и сачувати датотеке тако што ћете навести УРЛ.
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)
Имајте на уму да УРЛ наведена у овој функцији мора бити веза до саме датотеке.
На пример, у случају датотеке ГитХуб спремишта, следећа УРЛ адреса има пдф екстензију, али је заправо хтмл страница. Ако је ова УРЛ адреса наведена у горњој функцији, хтмл извор ће бити преузет.
- https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf
Веза до ентитета датотеке је следећа УРЛ адреса, коју треба да наведете ако желите да преузмете и сачувате датотеку.
- https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf
Постоје и случајеви када је приступ ограничен корисничким агентом, упућивачом, итд., што онемогућава преузимање. Не гарантујемо да ће све датотеке бити преузете.
Лако је користити Захтеве за промену или додавање заглавља захтева као што је кориснички агент.
Извуците УРЛ слике на веб страници.
Да бисте одједном преузели све слике на страници, прво издвојите УРЛ-ове слика и направите листу.
Ако је број секвенцијалан
Ако је УРЛ слике коју желите да преузмете једноставан редни број, то је лако. Ако УРЛ-ови нису само узастопни бројеви, већ имају и одређену регуларност, лакше је направити листу УРЛ-ова у складу са правилима, а не стругати са Прелепом супом (погледајте доле).
Користите нотацију за разумевање листе.
- Повезани чланци:Коришћење записа разумевања Питхон листе
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} се користи за троцифрени редни број попуњен нулом; {} се користи када попуњавање нуле није неопходно, а {:05} се користи за петоцифрени број уместо 3 цифре. За више информација о методи форматирања стринг стр, погледајте следећи чланак.
- Повезани чланци:Конверзија формата у Питхон-у, формат (попуњавање нуле, експоненцијална нотација, хексадецимална итд.)
Такође, овде користимо ппринт да олакшамо читање излаза.
Екстракт са прелепом супом
Да бисте масовно издвојили УРЛ-ове слика са веб страница, користите Прелепу супу.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://sr.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')]
У примеру, УРЛ сличице ове веб странице је издвојен.
Структура варира у зависности од веб странице, али се у основи добија на следећи начин.
- Преузмите листу &лт;имг&гт; означите објекте тако што ћете навести класу, ИД, итд. блока који садржи више слика које желите да преузмете.
soup.find(class_='list').find_all('img')
- Набавите УРЛ слике из елемента срц или елемента дата-срц у &лт;имг&гт; таг.
img.get('data-src')
Горњи пример кода је само пример и није гарантовано да ће радити.
Групно преузимање више слика са листе УРЛ адреса
Ако имате листу УРЛ адреса, можете је једноставно претворити у фор петљу и позвати функцију да преузмете и сачувате датотеку са првим приказаним УРЛ-ом. Због привремене листе УРЛ адреса, овде је коментарисан позив функције довнлоад_имаге_дир().
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
Да не бих преоптеретио сервер, користим тиме.слееп() да направим време чекања за свако преузимање слике. Јединица је у секундама, тако да се у горњем примеру увози и користи временски модул.
Пример је за сликовне датотеке, али и друге врсте датотека се могу преузимати заједно, све док су наведене.