Nasledujúci postup vysvetľuje, ako v jazyku Python zadať adresu URL obrázka, súboru ZIP, PDF alebo iného súboru na webe, stiahnuť ho a uložiť ako miestny súbor.
- Stiahnite obrázky zadaním adresy URL.
- Príklad kódu
urllib.request.urlopen()
:Otvoriť adresu URLopen()
:Zápis do súboru v binárnom režime- Jednoduchší príklad kódu
- Stiahnite si súbory ZIP, PDF atď.
- Výpis adresy URL obrázka na webovej stránke.
- Ak je číslo sekvenčné
- Extrakt s krásnou polievkou
- Dávkové sťahovanie viacerých obrázkov zo zoznamu adries URL
Stiahnite obrázky zadaním adresy URL.
Štandardnú knižnicu môžete používať len na sťahovanie jednotlivých súborov zadaním ich adries URL; nie je potrebná žiadna ďalšia inštalácia.
Príklad kódu
Nasleduje príklad funkcie, ktorá stiahne a uloží súbor zadaním adresy URL a cieľovej cesty a jej použitia. Tento kód je kvôli vysvetleniu trochu viac slovný. Jednoduchý príklad je uvedený nižšie.
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)
Ak chcete určiť cieľový adresár a uložiť súbor s názvom súboru URL, postupujte takto
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)
Pomocou funkcie os.path.basename() extrahuje názov súboru z adresy URL a spojí ho s adresárom zadaným pomocou funkcie os.path.join(), čím sa vytvorí cieľová cesta.
Nasledujúce časti opisujú časť získavania údajov a časť ukladania údajov do súboru.
urllib.request.urlopen(): Otvoriť adresu URL
Na otvorenie adresy URL a načítanie údajov použite urllib.request.urlopen(). Všimnite si, že urllib.urlopen() je v Pythone 2.6 a starších verziách zastaraná. urllib.request.urlretrieve() zatiaľ zastaraná nie je, ale v budúcnosti môže byť.
Ak sa chcete vyhnúť zastaveniu pri výskyte výnimky, zachyťte chybu pomocou try a except.
V príklade je importovaný súbor urllib.error a explicitne je zachytený len urllib.error.URLError. Chybové hlásenie sa zobrazí, ak URL adresa súboru neexistuje.
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
Ak chcete pri lokálnom ukladaní zachytiť aj výnimky (FileNotFoundError atď.), postupujte takto.(urllib.error.URLError, FileNotFoundError)
Na otvorenie url a získanie údajov je možné použiť aj knižnicu tretej strany Requests namiesto štandardnej knižnice urllib.
Zápis do súboru v binárnom režime v open()
Údaje, ktoré možno získať pomocou urllib.request.urlopen(), sú reťazec bajtov (typ bytes).
Open() s mode='wb' ako druhým argumentom zapisuje dáta ako binárne. w znamená zápis a b znamená binárne.
Jednoduchší príklad kódu
Vnorené príkazy s môžu byť napísané naraz, oddelené čiarkami.
Na základe toho môžeme napísať nasledovné.
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)
Stiahnite si súbory ZIP, PDF atď.
Doteraz uvedené príklady sa týkajú sťahovania a ukladania obrázkových súborov, ale keďže jednoducho otvárame súbor na webe a ukladáme ho ako miestny súbor, rovnaké funkcie možno použiť aj pre iné typy súborov.
Súbory môžete sťahovať a ukladať zadaním adresy 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)
Upozorňujeme, že adresa URL zadaná v tejto funkcii musí byť odkazom na samotný súbor.
Napríklad v prípade súboru úložiska GitHub má nasledujúca adresa URL príponu pdf, ale v skutočnosti je to stránka html. Ak je táto adresa URL zadaná vo vyššie uvedenej funkcii, stiahne sa zdroj html.
- https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf
Odkaz na entitu súboru je nasledujúca adresa URL, ktorú musíte zadať, ak chcete súbor stiahnuť a uložiť.
- https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf
Existujú aj prípady, keď je prístup obmedzený podľa agenta používateľa, odkazovateľa atď., čo znemožňuje sťahovanie. Nezaručujeme, že všetky súbory budú stiahnuté.
Na zmenu alebo pridanie hlavičiek požiadaviek, napríklad agenta používateľa, sa dá jednoducho použiť aplikácia Requests.
Výpis adresy URL obrázka na webovej stránke.
Ak chcete stiahnuť všetky obrázky na stránke naraz, najprv extrahujte adresy URL obrázkov a vytvorte ich zoznam.
Ak je číslo sekvenčné
Ak je adresa URL obrázka, ktorý chcete prevziať, jednoduché poradové číslo, je to jednoduché. Ak adresy URL nie sú len sekvenčné čísla, ale majú aj určitú pravidelnosť, je jednoduchšie vytvoriť zoznam adries URL podľa pravidiel, než škrabať pomocou Beautiful Soup (pozri nižšie).
Použite zápis s porozumením zoznamu.
- Súvisiace články:Používanie notácie zoznamov jazyka 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']
Vo vyššie uvedenom príklade sa {:03} používa pre 3-miestne sekvenčné číslo s nulovou náplňou; {} sa používa, keď nie je potrebné vyplniť nulu, a {:05} sa používa pre 5-miestne číslo namiesto 3-miestneho. Ďalšie informácie o metóde formátovania reťazca str nájdete v nasledujúcom článku.
- Súvisiace články:Konverzia formátu v jazyku Python, formát (vyplnenie nulou, exponenciálny zápis, hexadecimálny zápis atď.)
Aj tu používame pprint, aby bol výstup ľahšie čitateľný.
Extrakt s krásnou polievkou
Ak chcete hromadne extrahovať adresy URL obrázkov z webových stránok, použite program Beautiful Soup.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://sk.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')]
V tomto príklade sa extrahuje adresa URL miniatúrneho obrázka tejto webovej lokality.
Štruktúra sa líši v závislosti od webovej stránky, ale v zásade sa získa takto.
- Získanie zoznamu objektov značky <img> zadaním triedy, id atď. bloku, ktorý obsahuje viacero obrázkov, ktoré chcete stiahnuť.
soup.find(class_='list').find_all('img')
- Získajte adresu URL obrázka z prvku src alebo data-src tagu <img>.
img.get('data-src')
Uvedená ukážka kódu je len príkladom a nie je zaručené, že bude fungovať.
Dávkové sťahovanie viacerých obrázkov zo zoznamu adries URL
Ak máte zoznam adries URL, môžete ho jednoducho premeniť na cyklus for a zavolať funkciu na stiahnutie a uloženie súboru s prvou zobrazenou adresou URL. Kvôli dočasnému zoznamu adries URL je tu volanie funkcie download_image_dir() zakomentované.
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
Aby som nepreťažil server, používam time.sleep() na vytvorenie čakacieho času pre každé stiahnutie obrázka. Jednotka je v sekundách, takže vo vyššie uvedenom príklade je importovaný a použitý modul time.
Príklad sa týka obrázkových súborov, ale aj iné typy súborov sa môžu sťahovať spoločne, ak sú uvedené v zozname.