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.
- İlgili Makaleler:Python liste anlama gösterimini kullanma
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.
- İlgili Makaleler:Python’da format dönüştürme, format (sıfır doldurma, üstel gösterim, onaltılık, vb.)
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.