Ifuatayo inafafanua jinsi ya kubainisha URL ya picha, ZIP, PDF, au faili nyingine kwenye Wavuti kwenye Python, ipakue, na uihifadhi kama faili ya karibu.
- Pakua picha kwa kubainisha URL.
- Mfano wa kanuni
urllib.request.urlopen()
:Fungua URLopen()
:Andika kwa faili katika hali ya binary- Mfano rahisi zaidi wa nambari
- Pakua faili za ZIP, faili za PDF, n.k.
- Toa URL ya picha kwenye ukurasa wa wavuti.
- Ikiwa nambari ni ya mlolongo
- Dondoo na Supu Nzuri
- Kundi pakua picha nyingi kutoka kwa orodha ya URL
Pakua picha kwa kubainisha URL.
Unaweza kutumia maktaba ya kawaida kupakua faili mahususi pekee kwa kubainisha URL zao; hakuna usakinishaji wa ziada unaohitajika.
Mfano wa kanuni
Ufuatao ni mfano wa chaguo za kukokotoa zinazopakua na kuhifadhi faili kwa kubainisha URL na njia lengwa, na matumizi yake. Msimbo huu ni wa kitenzi kidogo kwa ajili ya maelezo. Mfano rahisi umetolewa hapa chini.
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)
Ili kutaja saraka lengwa na kuhifadhi faili kwa jina la faili la URL, fanya yafuatayo
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)
Hutoa jina la faili kutoka kwa URL iliyo na os.path.basename() na kuiunganisha na saraka iliyobainishwa na os.path.join() ili kutoa njia lengwa.
Sehemu zifuatazo zinaelezea sehemu ya upataji data na sehemu ya uhifadhi wa data kama faili.
urllib.request.urlopen():Fungua URL
Tumia urllib.request.urlopen() kufungua URL na kurejesha data. Kumbuka kuwa urllib.urlopen() imeacha kutumika kwenye Python 2.6 na mapema. urllib.request.urlretrieve() bado haijaacha kutumika, lakini inaweza kuwa katika siku zijazo.
Ili kuzuia kuacha wakati ubaguzi unatokea, pata hitilafu kwa kujaribu na isipokuwa.
Katika mfano, urllib.error imeingizwa nchini na ni urllib.error.URLError pekee ndiyo imenaswa kwa uwazi. Ujumbe wa hitilafu utaonyeshwa wakati URL ya faili haipo.
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
Ikiwa unataka pia kupata isipokuwa (FileNotFoundError, n.k.) wakati wa kuhifadhi ndani, fanya yafuatayo.(urllib.error.URLError, FileNotFoundError)
Pia inawezekana kutumia Maombi ya maktaba ya wahusika wengine badala ya urllib ya kawaida ya maktaba ili kufungua url na kupata data.
Andika kwa faili katika hali ya binary katika open()
Data inayoweza kupatikana kwa urllib.request.urlopen() ni mfuatano wa baiti (aina ya baiti).
Open() with mode=’wb’ kwani hoja ya pili inaandika data kama binary. w ina maana ya kuandika na b ina maana ya binary.
Mfano rahisi zaidi wa nambari
Iliyowekwa na taarifa inaweza kuandikwa mara moja, ikitenganishwa na koma.
Kwa kutumia hii, tunaweza kuandika zifuatazo.
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)
Pakua faili za ZIP, faili za PDF, n.k.
Mifano hadi sasa ni ya kupakua na kuhifadhi faili za picha, lakini kwa kuwa tunafungua faili kwenye wavuti na kuihifadhi kama faili ya ndani, kazi sawa zinaweza kutumika kwa aina nyingine za faili.
Unaweza kupakua na kuhifadhi faili kwa kubainisha 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)
Kumbuka kuwa URL iliyobainishwa katika chaguo hili la kukokotoa lazima iwe kiungo cha faili yenyewe.
Kwa mfano, katika kesi ya faili ya hazina ya GitHub, URL ifuatayo ina kiendelezi cha pdf lakini kwa kweli ni ukurasa wa html. Ikiwa URL hii imebainishwa katika chaguo za kukokotoa hapo juu, chanzo cha html kitapakuliwa.
- https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf
Kiungo cha huluki ya faili ni URL ifuatayo, ambayo unahitaji kutaja ikiwa unataka kupakua na kuhifadhi faili.
- https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf
Pia kuna matukio ambapo ufikiaji umezuiwa na wakala wa mtumiaji, kielekezi, n.k., na hivyo kufanya isiweze kupakua. Hatuhakikishi kuwa faili zote zitapakuliwa.
Ni rahisi kutumia Maombi kubadilisha au kuongeza vichwa vya ombi kama vile wakala wa mtumiaji.
Toa URL ya picha kwenye ukurasa wa wavuti.
Ili kupakua picha zote kwenye ukurasa mara moja, toa kwanza URL za picha na uunde orodha.
Ikiwa nambari ni ya mlolongo
Ikiwa URL ya picha unayotaka kupakua ni nambari rahisi ya mfuatano, ni rahisi. Ikiwa URL sio tu nambari zinazofuatana lakini pia zina kawaida, ni rahisi kutengeneza orodha ya URL kulingana na sheria badala ya kusugua kwa Supu Nzuri (tazama hapa chini).
Tumia nukuu ya ufahamu wa orodha.
- Nakala Zinazohusiana:Kutumia nukuu ya ufahamu wa orodha ya 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']
Katika mfano ulio hapo juu, {:03} inatumika kwa nambari ya mfuatano yenye tarakimu 3 iliyojazwa na sifuri; {} hutumika wakati kujaza sifuri si lazima, na {:05} inatumika kwa nambari ya tarakimu 5 badala ya tarakimu 3. Kwa habari zaidi kuhusu njia ya umbizo la kamba, angalia makala ifuatayo.
- Nakala Zinazohusiana:Ubadilishaji wa umbizo katika Chatu, umbizo (kujaza sifuri, nukuu ya ufafanuzi, heksadesimali, n.k.)
Pia, hapa tunatumia pprint kufanya pato kusomeka kwa urahisi.
Dondoo na Supu Nzuri
Ili kutoa URL za picha kutoka kwa kurasa za wavuti kwa wingi, tumia Supu Nzuri.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://sw.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')]
Katika mfano, URL ya picha ya kijipicha ya tovuti hii imetolewa.
Muundo hutofautiana kulingana na ukurasa wa wavuti, lakini kimsingi hupatikana kama ifuatavyo.
- Pata orodha ya <img> tagi vitu kwa kubainisha darasa, kitambulisho, n.k. ya kizuizi kilicho na picha nyingi unazotaka kupakua.
soup.find(class_='list').find_all('img')
- Pata URL ya picha kutoka kwa kipengele cha src au kipengele cha data-src cha <img> tagi.
img.get('data-src')
Nambari ya mfano hapo juu ni mfano tu na haijahakikishiwa kufanya kazi.
Kundi pakua picha nyingi kutoka kwa orodha ya URL
Ikiwa una orodha ya URLs, unaweza kuigeuza kuwa kitanzi na uite kitendakazi ili kupakua na kuhifadhi faili kwa kutumia URL ya kwanza iliyoonyeshwa. Kwa sababu ya orodha ya muda ya URL, kazi ya simu download_image_dir() imetolewa maoni hapa.
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
Ili nisipakie seva kupita kiasi, ninatumia time.sleep() kuunda muda wa kusubiri kwa kila upakuaji wa picha. Kitengo kiko katika sekunde, kwa hivyo katika mfano hapo juu, moduli ya wakati inaingizwa na kutumika.
Mfano ni wa faili za picha, lakini aina nyingine za faili zinaweza kupakuliwa pamoja, mradi tu zimeorodheshwa.