Pakua picha na faili zingine kutoka kwa wavuti kwenye Python (mmoja mmoja au kwa vikundi)

Biashara

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 URL
    • open():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.

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.

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.

Copied title and URL