Eftirfarandi útskýrir hvernig á að tilgreina slóð myndar, ZIP, PDF eða annarrar skráar á vefnum í Python, hlaða henni niður og vista hana sem staðbundna skrá.
- Sæktu myndir með því að tilgreina slóðina.
- Dæmi um kóða
urllib.request.urlopen()
:Opna vefslóðopen()
:Skrifaðu í skrá í tvíundarham- Einfaldara kóðadæmi
- Hlaða niður ZIP skrám, PDF skjölum osfrv.
- Dragðu út vefslóð myndarinnar á vefsíðunni.
- Ef númerið er í röð
- Dragðu út með fallegri súpu
- Hlaða niður mörgum myndum af lista yfir vefslóðir
Sæktu myndir með því að tilgreina slóðina.
Þú getur aðeins notað staðlaða bókasafnið til að hlaða niður einstökum skrám með því að tilgreina vefslóðir þeirra; engin viðbótaruppsetning er nauðsynleg.
Dæmi um kóða
Eftirfarandi er dæmi um aðgerð sem hleður niður og vistar skrá með því að tilgreina slóðina og áfangaslóðina og notkun hennar. Þessi kóði er dálítið orðaður til skýringar. Einfalt dæmi er gefið hér að neðan.
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)
Til að tilgreina áfangaskrána og vista skrána með vefslóð skráarnafni, gerðu eftirfarandi
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)
Það dregur út skráarnafnið úr vefslóðinni með os.path.basename() og tengir það við möppuna sem tilgreind er með os.path.join() til að búa til áfangaslóðina.
Eftirfarandi hlutar lýsa hluta gagnaöflunarinnar og hluta gagna sem vistast sem skrá.
urllib.request.urlopen():Opna vefslóð
Notaðu urllib.request.urlopen() til að opna slóðina og sækja gögnin. Athugaðu að urllib.urlopen() hefur verið úrelt í Python 2.6 og eldri. urllib.request.urlretrieve() hefur ekki verið úrelt ennþá, en gæti verið í framtíðinni.
Til að forðast að hætta þegar undantekning á sér stað skaltu grípa villuna með því að reyna og nema.
Í dæminu er urllib.error flutt inn og aðeins urllib.error.URLError er sérstaklega tekin upp. Villuboðin munu birtast þegar vefslóð skráarinnar er ekki til.
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
Ef þú vilt líka ná undantekningum (FileNotFoundError, osfrv.) þegar þú vistar á staðnum skaltu gera eftirfarandi.(urllib.error.URLError, FileNotFoundError)
Það er líka hægt að nota þriðja aðila bókasafnsbeiðnir í stað venjulegs bókasafns urllib til að opna slóðina og fá gögnin.
Skrifaðu í skrá í tvíundarham í open()
Gögnin sem hægt er að fá með urllib.request.urlopen() er bætastrengur (bætategund).
Open() með mode=’wb’ sem seinni röksemdin skrifar gögnin sem tvöfalt. w þýðir skrifa og b þýðir tvöfaldur.
Einfaldara kóðadæmi
Hreiður með yfirlýsingum er hægt að skrifa í einu, aðskilin með kommum.
Með því að nota þetta getum við skrifað eftirfarandi.
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)
Hlaða niður ZIP skrám, PDF skjölum osfrv.
Dæmin hingað til eru til að hlaða niður og vista myndaskrár, en þar sem við erum einfaldlega að opna skrá á vefnum og vista hana sem staðbundna skrá er hægt að nota sömu aðgerðir fyrir aðrar gerðir skráa.
Þú getur hlaðið niður og vistað skrár með því að tilgreina slóðina.
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)
Athugaðu að vefslóðin sem tilgreind er í þessari aðgerð verður að vera hlekkur á skrána sjálfa.
Til dæmis, ef um er að ræða GitHub geymsluskrá, hefur eftirfarandi vefslóð pdf ending en er í raun HTML síða. Ef þessi vefslóð er tilgreind í fallinu hér að ofan verður html uppspretta niðurhalað.
- https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf
Tengill á skráareininguna er eftirfarandi vefslóð sem þú þarft að tilgreina ef þú vilt hlaða niður og vista skrána.
- https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf
Það eru líka tilvik þar sem aðgangur er takmarkaður af umboðsmanni notenda, tilvísunaraðila osfrv., sem gerir það ómögulegt að hlaða niður. Við ábyrgjumst ekki að allar skrár verði sóttar.
Það er auðvelt að nota beiðnir til að breyta eða bæta við beiðnihausum eins og umboðsmanni notenda.
Dragðu út vefslóð myndarinnar á vefsíðunni.
Til að hlaða niður öllum myndum á síðu í einu skaltu fyrst draga slóðir myndanna út og búa til lista.
Ef númerið er í röð
Ef slóð myndarinnar sem þú vilt hlaða niður er einfalt raðnúmer er það auðvelt. Ef vefslóðirnar eru ekki bara raðnúmer heldur einnig einhverja reglusemi er auðveldara að gera lista yfir vefslóðir samkvæmt reglunum frekar en að skrapa með fallegri súpu (sjá hér að neðan).
Notaðu listaskilning.
- Tengdar greinar:Notkun Python listaskilnings nótnaskriftar
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']
Í dæminu hér að ofan er {:03} notað fyrir þriggja stafa núllfyllt raðnúmer; {} er notað þegar núllfylling er ekki nauðsynleg og {:05} er notað fyrir 5 stafa tölu í stað 3 tölustafa. Fyrir frekari upplýsingar um sniðaðferð streng str, sjá eftirfarandi grein.
Einnig, hér erum við að nota pprint til að gera úttakið auðveldara að lesa.
Dragðu út með fallegri súpu
Til að draga myndavefslóðir út af vefsíðum í lausu skaltu nota Beautiful Soup.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://is.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')]
Í dæminu er vefslóð smámyndar þessarar vefsíðu dregin út.
Uppbyggingin er mismunandi eftir vefsíðunni en í grundvallaratriðum fæst hún sem hér segir.
- Fáðu lista yfir <img> merktu hluti með því að tilgreina flokk, auðkenni osfrv. blokkarinnar sem inniheldur margar myndirnar sem þú vilt hlaða niður.
soup.find(class_='list').find_all('img')
- Fáðu slóð myndarinnar frá src einingunni eða data-src einingunni í <img> merki.
img.get('data-src')
Ofangreind sýnishornskóði er bara dæmi og ekki tryggt að virki.
Hlaða niður mörgum myndum af lista yfir vefslóðir
Ef þú ert með lista yfir vefslóðir geturðu bara breytt honum í for-lykkju og hringt í aðgerðina til að hlaða niður og vista skrána með fyrstu vefslóðinni sem birtist. Vegna tímabundinna vefslóðalistans er aðgerðakallið download_image_dir() skrifað um athugasemdir hér.
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
Til þess að ofhlaða ekki þjóninum nota ég time.sleep() til að búa til biðtíma fyrir hverja mynd sem er hlaðið niður. Einingin er í sekúndum, þannig að í dæminu hér að ofan er tímaeiningin flutt inn og notuð.
Dæmið er fyrir myndaskrár, en einnig er hægt að hlaða niður öðrum tegundum skráa saman, svo framarlega sem þær eru skráðar.