Ніжэй тлумачыцца, як задаць URL-адрас выявы, ZIP, PDF або іншага файла ў Інтэрнэце ў Python, загрузіць яго і захаваць як лакальны файл.
- Спампуйце выявы, указаўшы URL.
- Прыклад кода
urllib.request.urlopen()
:Адкрыць URLopen()
:Запіс у файл у двайковым рэжыме- Больш просты прыклад кода
- Спампуйце файлы 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
Выкарыстоўвайце urllib.request.urlopen(), каб адкрыць URL і атрымаць даныя. Звярніце ўвагу, што 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)
Таксама можна выкарыстоўваць запыты старонніх бібліятэк замест стандартнай бібліятэкі urllib, каб адкрыць URL і атрымаць дадзеныя.
Запісаць у файл у двайковым рэжыме ў open()
Дадзеныя, якія можна атрымаць з дапамогай 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-адрасоў у адпаведнасці з правіламі, чым выскрабаць з дапамогай Beautiful Soup (гл. ніжэй).
Выкарыстоўвайце запісы для разумення спісу.
- Падобныя артыкулы:Выкарыстанне абазначэння разумення спісу 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} выкарыстоўваецца для 5-значнага ліку замест 3-значных. Для атрымання дадатковай інфармацыі аб метадзе фарматавання радка str глядзіце наступны артыкул.
- Падобныя артыкулы:Пераўтварэнне фармату ў Python, фармат (запаўненне нуля, экспанентны запіс, шаснаццатковы і г.д.)
Акрамя таго, тут мы выкарыстоўваем pprint, каб зрабіць выхад больш простым для чытання.
Экстракт з прыгожым супам
Каб атрымаць масавыя URL-адрасы малюнкаў з вэб-старонак, выкарыстоўвайце Beautiful Soup.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://be.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 выявы з элемента src або элемента data-src з <img> тэг.
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(), каб стварыць час чакання для кожнай загрузкі выявы. Адзінка выяўляецца ў секундах, таму ў прыведзеным вышэй прыкладзе імпартуецца і выкарыстоўваецца модуль часу.
Прыклад для файлаў малюнкаў, але іншыя тыпы файлаў таксама можна спампоўваць разам, пакуль яны ў спісе.