Web’den Python’da görüntüleri ve diğer dosyaları indirin (tek tek veya toplu olarak)

Aşağıda Python’da Web’deki bir görüntünün, ZIP’nin, PDF’nin veya başka bir dosyanın URL’sinin nasıl belirleneceği, indirileceği ve yerel dosya olarak nasıl kaydedileceği açıklanmaktadır.

  • URL’yi belirterek görüntüleri indirin.
    • Kod örneği
    • urllib.request.urlopen():Link aç
    • open():İkili modda bir dosyaya yaz
    • Daha basit bir kod örneği
  • ZIP dosyalarını, PDF dosyalarını vb. indirin.
  • Web sayfasındaki resmin URL’sini çıkarın.
    • Numara sıralı ise
    • Güzel Çorba ile Özü
  • Bir URL listesinden birden çok görüntüyü toplu olarak indirin

URL’yi belirterek görüntüleri indirin.

Standart kitaplığı yalnızca URL’lerini belirterek tek tek dosyaları indirmek için kullanabilirsiniz; ek kurulum gerekmez.

Kod örneği

Aşağıda, URL’yi ve hedef yolu ve kullanımını belirterek bir dosyayı indiren ve kaydeden bir işlev örneği verilmiştir. Bu kod, açıklama amacıyla biraz ayrıntılıdır. Aşağıda basit bir örnek verilmiştir.

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)

Hedef dizini belirtmek ve dosyayı URL dosya adıyla kaydetmek için aşağıdakileri yapın

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)

Dosya adını os.path.basename() ile URL’den çıkarır ve hedef yolu oluşturmak için os.path.join() ile belirtilen dizinle birleştirir.

Aşağıdaki bölümlerde, veri toplamanın bir kısmı ve bir dosya olarak veri kaydetmenin bir kısmı anlatılmaktadır.

urllib.request.urlopen():Link aç

URL’yi açmak ve verileri almak için urllib.request.urlopen() kullanın. urllib.urlopen() öğesinin Python 2.6 ve önceki sürümlerde kullanımdan kaldırıldığını unutmayın. urllib.request.urlretrieve() henüz kullanımdan kaldırılmadı, ancak gelecekte olabilir.

Bir istisna oluştuğunda durmayı önlemek için, try ve hariç ile hatayı yakalayın.

Örnekte, urllib.error içe aktarılır ve yalnızca urllib.error.URLError açıkça yakalanır. Dosyanın URL’si olmadığında hata mesajı görüntülenecektir.

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

Yerel olarak kaydederken istisnaları da (FileNotFoundError vb.) yakalamak istiyorsanız aşağıdakileri yapın.
(urllib.error.URLError, FileNotFoundError)

URL’yi açmak ve verileri almak için standart kitaplık urllib’i yerine üçüncü taraf kitaplık İsteklerini kullanmak da mümkündür.

open() ile ikili modda bir dosyaya yaz

urllib.request.urlopen() ile elde edilebilecek veriler bir bayt dizgisidir (bayt tipi).

İkinci argüman olarak mode=’wb’ ile Open() verileri ikili olarak yazar. w yazma anlamına gelir ve b ikili anlamına gelir.

Daha basit bir kod örneği

İç içe ifadeler, virgülle ayırarak bir kerede yazılabilir.

Bunu kullanarak aşağıdakileri yazabiliriz.

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 dosyalarını, PDF dosyalarını vb. indirin.

Şimdiye kadarki örnekler, görüntü dosyalarını indirmek ve kaydetmek içindir, ancak biz sadece bir dosyayı web’de açıp yerel bir dosya olarak kaydettiğimiz için, aynı işlevler diğer dosya türleri için de kullanılabilir.

URL’yi belirterek dosyaları indirebilir ve kaydedebilirsiniz.

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)

Bu işlevde belirtilen URL’nin dosyanın kendisine bir bağlantı olması gerektiğini unutmayın.

Örneğin, GitHub veri havuzu dosyası söz konusu olduğunda, aşağıdaki URL bir pdf uzantısına sahiptir ancak aslında bir html sayfasıdır. Bu URL yukarıdaki fonksiyonda belirtilirse, html kaynağı indirilecektir.

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

Dosya varlığının bağlantısı, dosyayı indirmek ve kaydetmek isteyip istemediğinizi belirtmeniz gereken aşağıdaki URL’dir.

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

Ayrıca erişimin kullanıcı aracısı, yönlendiren vb. tarafından kısıtlandığı ve indirmeyi imkansız hale getirdiği durumlar da vardır. Tüm dosyaların indirileceğini garanti etmiyoruz.

Kullanıcı aracısı gibi istek başlıklarını değiştirmek veya eklemek için İstekleri kullanmak kolaydır.

Web sayfasındaki resmin URL’sini çıkarın.

Bir sayfadaki tüm görselleri tek seferde indirmek için öncelikle görsellerin URL’lerini çıkartın ve bir liste oluşturun.

Numara sıralı ise

İndirmek istediğiniz görselin URL’si basit bir sıra numarası ise, bu kolaydır. URL’ler sadece sıralı sayılar değil, aynı zamanda biraz düzenliyse, Güzel Çorba ile kazımak yerine kurallara göre URL’lerin bir listesini yapmak daha kolaydır (aşağıya bakın).

Liste anlama gösterimini kullanın.

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

Yukarıdaki örnekte, 3 basamaklı sıfır doldurulmuş sıralı sayı için {:03} kullanılmıştır; {}, sıfır doldurmanın gerekli olmadığı durumlarda kullanılır ve {:05}, 3 basamak yerine 5 basamaklı bir sayı için kullanılır. str dizesinin biçim yöntemi hakkında daha fazla bilgi için aşağıdaki makaleye bakın.

Ayrıca, çıktının okunmasını kolaylaştırmak için burada pprint kullanıyoruz.

Güzel Çorba ile Özü

Web sayfalarından toplu olarak resim URL’lerini çıkarmak için Güzel Çorba’yı kullanın.

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

from bs4 import BeautifulSoup

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

Örnekte, bu web sitesinin küçük resminin URL’si çıkarılır.

Yapısı web sayfasına göre değişmekle birlikte temel olarak şu şekilde elde edilmektedir.

  • <img> indirmek istediğiniz birden çok görüntüyü içeren bloğun sınıfını, kimliğini vb. belirterek nesneleri etiketleyin.
    • soup.find(class_='list').find_all('img')
  • Görüntünün URL’sini <img> etiket.
    • img.get('data-src')

Yukarıdaki örnek kod yalnızca bir örnektir ve çalışması garanti edilmez.

Bir URL listesinden birden çok görüntüyü toplu olarak indirin

Bir URL listeniz varsa, bunu bir for döngüsüne dönüştürebilir ve gösterilen ilk URL ile dosyayı indirmek ve kaydetmek için işlevi çağırabilirsiniz. Geçici URL listesi nedeniyle, download_image_dir() işlev çağrısı burada yorumlanı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

Sunucuya aşırı yüklenmemek için her bir imaj indirme işlemi için bir bekleme süresi oluşturmak için time.sleep() kullanıyorum. Birim saniye cinsindendir, dolayısıyla yukarıdaki örnekte zaman modülü alınır ve kullanılır.

Örnek resim dosyaları içindir, ancak listelendikleri sürece diğer dosya türleri de birlikte indirilebilir.

Copied title and URL