Shkarkoni imazhe dhe skedarë të tjerë nga uebi në Python (individualisht ose në grupe)

biznes

Më poshtë shpjegon se si të specifikoni URL-në e një imazhi, ZIP, PDF ose skedari tjetër në ueb në Python, ta shkarkoni dhe ta ruani si skedar lokal.

  • Shkarkoni imazhet duke specifikuar URL-në.
    • Shembull kodi
    • urllib.request.urlopen():Hap URL
    • open():Shkruani në një skedar në modalitetin binar
    • Një shembull kodi më i thjeshtë
  • Shkarkoni skedarë ZIP, skedarë PDF, etj.
  • Ekstraktoni URL-në e imazhit në faqen e internetit.
    • Nëse numri është sekuencial
    • Ekstrakt me supë të bukur
  • Shkarkimi në grup i imazheve të shumta nga një listë URL-sh

Shkarkoni imazhet duke specifikuar URL-në.

Ju mund të përdorni bibliotekën standarde vetëm për të shkarkuar skedarë individualë duke specifikuar URL-të e tyre; nuk kërkohet instalim shtesë.

Shembull kodi

Më poshtë është një shembull i një funksioni që shkarkon dhe ruan një skedar duke specifikuar URL-në dhe shtegun e destinacionit, si dhe përdorimin e tij. Ky kod është pak i zhdërvjellët për hir të shpjegimit. Një shembull i thjeshtë është dhënë më poshtë.

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)

Për të specifikuar drejtorinë e destinacionit dhe për të ruajtur skedarin me emrin e skedarit URL, bëni sa më poshtë

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)

Ai nxjerr emrin e skedarit nga URL-ja me os.path.basename() dhe e bashkon atë me drejtorinë e specifikuar me os.path.join() për të gjeneruar shtegun e destinacionit.

Seksionet e mëposhtme përshkruajnë pjesën e marrjes së të dhënave dhe pjesën e ruajtjes së të dhënave si skedar.

urllib.request.urlopen():Hap URL

Përdor urllib.request.urlopen() për të hapur URL-në dhe për të marrë të dhënat. Vini re se urllib.urlopen() është zhvlerësuar në Python 2.6 dhe më herët. urllib.request.urlretrieve() nuk është përdorur ende, por mund të jetë në të ardhmen.

Për të shmangur ndalimin kur ndodh një përjashtim, kapeni gabimin me provo dhe përveç.

Në shembull, urllib.error është importuar dhe vetëm urllib.error.URLError është kapur në mënyrë eksplicite. Mesazhi i gabimit do të shfaqet kur URL-ja e skedarit nuk ekziston.

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

Nëse dëshironi të kapni gjithashtu përjashtime (FileNotFoundError, etj.) kur ruani në nivel lokal, bëni sa më poshtë.
(urllib.error.URLError, FileNotFoundError)

Është gjithashtu e mundur të përdoret Kërkesat e bibliotekës së palëve të treta në vend të urllib standarde të bibliotekës për të hapur url-në dhe për të marrë të dhënat.

Shkruani në një skedar në modalitetin binar në open()

Të dhënat që mund të merren me urllib.request.urlopen() janë një varg bajt (lloji bytes).

Open() me mode=’wb’ si argument i dytë i shkruan të dhënat si binare. w do të thotë shkrim dhe b do të thotë binare.

Një shembull kodi më i thjeshtë

Deklaratat e mbivendosura mund të shkruhen menjëherë, të ndara me presje.

Duke përdorur këtë, ne mund të shkruajmë sa vijon.

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)

Shkarkoni skedarë ZIP, skedarë PDF, etj.

Shembujt e deritanishëm janë për shkarkimin dhe ruajtjen e skedarëve të imazhit, por duke qenë se thjesht hapim një skedar në ueb dhe e ruajmë atë si skedar lokal, të njëjtat funksione mund të përdoren për lloje të tjera skedarësh.

Ju mund të shkarkoni dhe ruani skedarë duke specifikuar URL-në.

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)

Vini re se URL-ja e specifikuar në këtë funksion duhet të jetë një lidhje me vetë skedarin.

Për shembull, në rastin e një skedari të depove GitHub, URL-ja e mëposhtme ka një shtrirje pdf, por në fakt është një faqe html. Nëse kjo URL specifikohet në funksionin e mësipërm, burimi html do të shkarkohet.

  • https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf

Lidhja me entitetin e skedarit është URL-ja e mëposhtme, të cilën duhet ta specifikoni nëse dëshironi të shkarkoni dhe ruani skedarin.

  • https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf

Ka edhe raste kur qasja kufizohet nga agjenti i përdoruesit, referuesi etj., duke e bërë të pamundur shkarkimin. Ne nuk garantojmë që të gjithë skedarët do të shkarkohen.

Është e lehtë për t’u përdorur Kërkesat për të ndryshuar ose shtuar titujt e kërkesave, si p.sh. agjenti i përdoruesit.

Ekstraktoni URL-në e imazhit në faqen e internetit.

Për të shkarkuar të gjitha imazhet në një faqe menjëherë, së pari nxirrni URL-të e imazheve dhe krijoni një listë.

Nëse numri është sekuencial

Nëse URL-ja e imazhit që dëshironi të shkarkoni është një numër i thjeshtë vijues, është e lehtë. Nëse URL-të nuk janë vetëm numra sekuencialë, por kanë edhe njëfarë rregullsie, është më e lehtë të bëni një listë të URL-ve sipas rregullave në vend që të gërvishtni me Supë e bukur (shih më poshtë).

Përdorni shënimin e të kuptuarit të listës.

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']

Në shembullin e mësipërm, {:03} përdoret për një numër vijues 3-shifror të mbushur me zero; {} përdoret kur mbushja e zeros nuk është e nevojshme dhe {:05} përdoret për një numër 5-shifror në vend të 3 shifrave. Për më shumë informacion rreth metodës së formatit të string str, shihni artikullin vijues.

Gjithashtu, këtu ne po përdorim pprint për ta bërë produktin më të lehtë për t’u lexuar.

Ekstrakt me supë të bukur

Për të nxjerrë me shumicë URL-të e imazheve nga faqet e internetit, përdorni “Supën e bukur”.

import os
import time
import urllib.error
import urllib.request

from bs4 import BeautifulSoup

url = 'https://sq.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')]

Në shembull, është nxjerrë URL-ja e imazhit miniaturë të kësaj faqe interneti.

Struktura ndryshon në varësi të faqes së internetit, por në thelb ajo merret si më poshtë.

  • Merrni një listë të <img> etiketoni objektet duke specifikuar klasën, id, etj. të bllokut që përmban imazhet e shumta që dëshironi të shkarkoni.
    • soup.find(class_='list').find_all('img')
  • Merrni URL-në e imazhit nga elementi src ose elementi data-src i <img> etiketë.
    • img.get('data-src')

Kodi i mësipërm i mostrës është vetëm një shembull dhe nuk garantohet të funksionojë.

Shkarkimi në grup i imazheve të shumta nga një listë URL-sh

Nëse keni një listë URL-sh, thjesht mund ta ktheni atë në një lak për dhe të telefononi funksionin për të shkarkuar dhe ruajtur skedarin me URL-në e parë të treguar. Për shkak të listës së përkohshme të URL-ve, thirrja e funksionit download_image_dir() komentohet këtu.

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

Për të mos e mbingarkuar serverin, unë përdor time.sleep() për të krijuar një kohë pritjeje për çdo shkarkim imazhi. Njësia është në sekonda, kështu që në shembullin e mësipërm, moduli i kohës importohet dhe përdoret.

Shembulli është për skedarët e imazheve, por lloje të tjera skedarësh mund të shkarkohen gjithashtu së bashku, për sa kohë që ato janë të listuara.

Copied title and URL