Aşağıda Python-da İnternetdə şəkil, ZIP, PDF və ya digər faylın URL-ni necə təyin etmək, onu yükləmək və yerli fayl kimi saxlamaq izah edilir.
- URL göstərərək şəkilləri yükləyin.
- Kod nümunəsi
urllib.request.urlopen()
:URL açınopen()
:İkili rejimdə fayla yazın- Daha sadə kod nümunəsi
- ZIP faylları, PDF faylları və s. yükləyin.
- Veb səhifəsində şəklin URL-ni çıxarın.
- Əgər nömrə ardıcıldırsa
- Gözəl şorba ilə çıxarış
- URL siyahısından çoxlu şəkilləri toplu yükləyin
URL göstərərək şəkilləri yükləyin.
Siz standart kitabxanadan yalnız onların URL-lərini göstərərək fərdi faylları yükləmək üçün istifadə edə bilərsiniz; əlavə quraşdırma tələb olunmur.
Kod nümunəsi
Aşağıda URL və təyinat yolunu və onun istifadəsini göstərərək faylı endirən və saxlayan funksiya nümunəsidir. Bu kod izahat üçün bir az müfəssəldir. Sadə bir nümunə aşağıda verilmişdir.
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)
Təyinat qovluğunu təyin etmək və faylı URL fayl adı ilə saxlamaq üçün aşağıdakıları edin
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)
O, os.path.basename() ilə URL-dən fayl adını çıxarır və təyinat yolunu yaratmaq üçün onu os.path.join() ilə müəyyən edilmiş qovluqla birləşdirir.
Aşağıdakı bölmələr məlumatların əldə edilməsi hissəsini və məlumatların fayl kimi saxlanmasını təsvir edir.
urllib.request.urlopen():URL açın
URL-i açmaq və məlumatları əldə etmək üçün urllib.request.urlopen() istifadə edin. Qeyd edək ki, urllib.urlopen() Python 2.6 və daha əvvəlki versiyalarda köhnəlmişdir. urllib.request.urlretrieve() hələ köhnəlməyib, lakin gələcəkdə ola bilər.
İstisna baş verdikdə dayandırılmamaq üçün cəhd və istisna ilə xətanı tutun.
Nümunədə urllib.error idxal edilir və yalnız urllib.error.URLError açıq şəkildə tutulur. Faylın URL-i mövcud olmadıqda xəta mesajı göstəriləcək.
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
Lokal olaraq yadda saxlayarkən istisnaları da (FileNotFoundError və s.) tutmaq istəyirsinizsə, aşağıdakıları edin.(urllib.error.URLError, FileNotFoundError)
URL-i açmaq və məlumatları əldə etmək üçün standart kitabxana urllib əvəzinə üçüncü tərəf kitabxanasının Sorğularından istifadə etmək də mümkündür.
Open()-də ikili rejimdə fayla yazın
urllib.request.urlopen() ilə əldə edilə bilən məlumatlar bayt sətiridir (bayt növü).
Open() rejimi=’wb’ ilə ikinci arqument verilənləri binar kimi yazır. w yazmaq, b isə ikilik deməkdir.
Daha sadə kod nümunəsi
Vergüllə ayrılmış ifadələrlə iç-içə yazıla bilər.
Bundan istifadə edərək aşağıdakıları yaza bilərik.
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)
ZIP faylları, PDF faylları və s. yükləyin.
İndiyə qədərki nümunələr şəkil fayllarını yükləmək və saxlamaq üçündür, lakin biz sadəcə internetdə faylı açıb onu yerli fayl kimi saxladığımız üçün eyni funksiyalar digər fayl növləri üçün də istifadə edilə bilər.
Siz URL göstərərək faylları yükləyə və saxlaya bilərsiniz.
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)
Qeyd edək ki, bu funksiyada göstərilən URL faylın özünə keçid olmalıdır.
Məsələn, GitHub repozitor faylı vəziyyətində, aşağıdakı URL-nin pdf uzantısı var, lakin əslində html səhifəsidir. Bu URL yuxarıdakı funksiyada göstərilibsə, html mənbəyi endiriləcək.
- https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf
Fayl obyektinə keçid aşağıdakı URL-dir, faylı endirmək və saxlamaq istəsəniz, onu göstərməlisiniz.
- https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf
Elə hallar da var ki, giriş istifadəçi agenti, yönləndirici və s. tərəfindən məhdudlaşdırılır ki, bu da yükləməni qeyri-mümkün edir. Bütün faylların yüklənəcəyinə zəmanət vermirik.
İstifadəçi agenti kimi sorğu başlıqlarını dəyişdirmək və ya əlavə etmək üçün Sorğulardan istifadə etmək asandır.
Veb səhifəsində şəklin URL-ni çıxarın.
Bir səhifədəki bütün şəkilləri birdən yükləmək üçün əvvəlcə şəkillərin URL-lərini çıxarın və siyahı yaradın.
Əgər nömrə ardıcıldırsa
Yükləmək istədiyiniz şəklin URL-i sadə ardıcıl nömrədirsə, bu, asandır. URL-lər yalnız ardıcıl nömrələr deyil, həm də müəyyən qanunauyğunluqlara malikdirsə, URL-lərin siyahısını Gözəl Şorba ilə qırmaqdansa, qaydalara uyğun olaraq hazırlamaq daha asandır (aşağıya bax).
Siyahının başa düşülməsi qeydindən istifadə edin.
- Əlaqədar Məqalələr:Python siyahısı başa düşmə notasiyasından istifadə
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']
Yuxarıdakı misalda {:03} 3 rəqəmli sıfırla doldurulmuş ardıcıl nömrə üçün istifadə olunur; {} sıfır doldurulması lazım olmadıqda, {:05} isə 3 rəqəm əvəzinə 5 rəqəmli ədəd üçün istifadə olunur. String str-nin format metodu haqqında ətraflı məlumat üçün aşağıdakı məqaləyə baxın.
- Əlaqədar Məqalələr:Python-da formatın dəyişdirilməsi, format (sıfır doldurma, eksponensial qeyd, onaltılıq və s.)
Həmçinin, burada çıxışın oxunmasını asanlaşdırmaq üçün pprint istifadə edirik.
Gözəl şorba ilə çıxarış
Veb səhifələrdən toplu şəkildə şəkil URL-lərini çıxarmaq üçün Gözəl Şorbadan istifadə edin.
import os import time import urllib.error import urllib.request from bs4 import BeautifulSoup url = 'https://az.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ümunədə, bu veb-saytın miniatür şəklinin URL-i çıxarılıb.
Struktur web səhifəsindən asılı olaraq dəyişir, lakin əsasən aşağıdakı kimi əldə edilir.
- <img> yükləmək istədiyiniz çoxsaylı şəkilləri ehtiva edən blokun sinfini, id və s.-ni göstərərək obyektləri etiketləyin.
soup.find(class_='list').find_all('img')
- Şəklin URL-ni <img> src elementindən və ya data-src elementindən əldə edin; etiket.
img.get('data-src')
Yuxarıdakı nümunə kodu sadəcə bir nümunədir və işləməsinə zəmanət verilmir.
URL siyahısından çoxlu şəkilləri toplu yükləyin
Əgər sizdə URL siyahısı varsa, onu sadəcə olaraq for döngəsinə çevirə və göstərilən ilk URL ilə faylı yükləmək və saxlamaq üçün funksiyaya zəng edə bilərsiniz. Müvəqqəti URL siyahısına görə download_image_dir() funksiyası burada şərh edilir.
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
Serveri həddən artıq yükləməmək üçün mən time.sleep() funksiyasından istifadə edərək hər şəklin endirilməsi üçün gözləmə müddəti yaradıram. Vahid saniyələrlədir, buna görə də yuxarıdakı nümunədə vaxt modulu idxal edilir və istifadə olunur.
Nümunə şəkil faylları üçündür, lakin sadalandığı müddətcə digər növ faylları da birlikdə endirmək olar.