Eski web sitenizi yeni bir altyapıya taşıyorsunuz. Siteyi kuran ajansla yollarınız ayrılmış, sunucuya erişiminiz yok ve ürün sayfalarında birkaç yüz fotoğraf duruyor. Her birini tek tek kaydetmek günler sürer. Denediğiniz ilk birkaç resim de sayfada göründüğünden küçük ve bulanık indi.
Bu yazıdaki yöntemler, kopyalama izniniz olan resimler içindir: kendi siteniz, bir kurumun gazetecilere sunduğu basın kiti ya da koşullarına uyduğunuz açık lisanslı görseller. Bir rakibin ürün fotoğraflarını kendi mağazanızda kullanmak bu yazının konusu değil. Bir resmi indirebiliyor olmanız, onu kullanma hakkınız olduğu anlamına da gelmez (Web Scraping (Web Kazıma) Yasal mı?). Aşağıda bir sayfadaki bütün resimleri kod yazmadan kaydetmenin dört yolunu, resimlerin neden küçük indiğini ya da hiç inmediğini, WebP dosyalarıyla ne yapacağınızı ve isteğe bağlı bir Python betiğini bulacaksınız.
Bir sayfadaki resimler nereden gelir?
Sayfadaki her resim ayrı bir dosyadır. Sayfanın kendisi, her resmin nerede durduğunu söyleyen bir metin dosyasıdır (HTML). Tarayıcınız her resmi ayrı bir istekle çeker.
Bir resim sayfaya üç yoldan girer. Birincisi, sağ tıklayıp kaydedebildiğiniz img etiketidir. İkincisi CSS arka planıdır; bazı banner görsellerinde kaydetme seçeneği çıkmamasının nedeni budur. Üçüncüsü picture öğesidir: aynı resmi birkaç biçim ve boyutta listeler, hangisinin yükleneceğini tarayıcıya bırakır.
Birçok site resimlerini bir CDN (content delivery network, içerik dağıtım ağı) üzerinden sunar. CDN, dosyaları ziyaretçiye yakın bir noktadan gönderen bir sunucu ağıdır. İndirdiğiniz dosyaların adlarının çoğu zaman rastgele görünmesi bu yüzdendir.
Sayfadaki tüm resimler nasıl indirilir?
Aşağıdaki yöntemlerin hepsi aynı dört adımı izler:
- Sayfayı açın ve en alta kadar kaydırın. Sayfanın alt kısmındaki resimler çoğu zaman ancak oraya geldiğinizde yüklenir.
- Tablodan bir yöntem seçin.
- Klasörü temizleyin. Logoları, simgeleri ve bir piksellik izleme resimlerini silin.
- Boyutu kontrol edin. Resim ekranda göründüğünden küçükse tam boy adresini arayın.
| Yöntem | Ne elde edersiniz | Kaydırınca yüklenen resimler | Tam boy mu? | Kime uygun |
|---|---|---|---|---|
| Chrome: Sayfayı farklı kaydet > Web Sayfası, Tamamı | Bir HTML dosyası ve sayfanın dosyalarını tutan bir klasör | Betikle yüklenenler yalnız kaydırdıktan sonra | Hayır, ekranınız için seçilen kopya | Tek sayfa, hiçbir şey kurmadan |
| Toplu resim indirme eklentisi | Filtreledikten sonra işaretlediğiniz resimler | Önce kaydırdıysanız evet | Çoğu zaman ekrandaki kopya | Birkaç sayfa, boyuta göre ayıklama |
| Firefox: Sayfa Bilgileri > Ortam | Sayfadaki her resim, arka planlar dahil | Önce kaydırdıysanız evet | Sayfanın yüklediği kopya | Firefox, eklentisiz |
| DevTools > Ağ > Resim | Tek tek dosyalar, gerçek adresleriyle | Evet, kaydırdıkça | En büyük kopyayı seçerseniz evet | Birkaç resim, tam boy |
| Python betiği (ileri seviye) | HTML'deki her img ve source adresi | data-src değerini okur, JavaScript ile eklenenleri kaçırır | srcset içindeki en büyük kopyayı seçer | Düzenli tekrarlanan işler |
Chrome'da tüm resimleri Web Sayfası, Tamamı seçeneğiyle kaydetme
Bu yöntem için hiçbir şey kurmanız gerekmez. Sayfayı açın ve en alta kadar kaydırın. Sonra sağ üstteki üç nokta menüsünü açıp Yayınla, kaydet ve paylaş > Sayfayı farklı kaydet yolunu izleyin (Ctrl+S, Mac'te Cmd+S). Adımlar Chrome yardım sayfasında da anlatılıyor.
Kayıt türünü Web Sayfası, Tamamı yapıp Kaydet'e tıklayın. Chrome bir .html dosyası yazar, hemen yanına da aynı adı taşıyan ve sonu _files ile biten bir klasör açar. Resimler bu klasörde stil dosyaları ve betiklerle karışık durur; klasörü türe göre sıralarsanız kolayca bulursunuz.
Chrome, sayfanın o anda gösterdiği dosyaları kaydeder. Hiç kaydırmadıysanız, bir betiğin kaydırınca yerine koyduğu resimler eksik kalır. Ayrıca her zaman orijinalleri değil, ekranınıza gönderilen kopyaları alırsınız.
Toplu resim indirme eklentisi nasıl kullanılır?
Chrome Web Mağazası'nda "image downloader" ya da "resim indirme" diye aratırsanız açık sekmedeki bütün resimleri listeleyen eklentiler çıkar. Sık sık el değiştirdikleri için hiçbirinin adını vermiyoruz. Çoğu şöyle çalışır:
- Eklentiyi kurun, sayfayı açın ve en alta kadar kaydırın.
- Eklentinin simgesine tıklayın. Sayfadaki resimlerden oluşan bir ızgara açılır.
- Simgeler ve küçük önizlemeler elenene kadar en küçük genişlik filtresini yükseltin.
- İstediğiniz resimleri işaretleyip indirme düğmesine tıklayın.
Her resim için ayrı bir kaydetme penceresiyle uğraşmamak için Ayarlar > İndirilenler bölümüne gidin ve İndirmeden önce her dosyanın nereye kaydedileceğini sor seçeneğini kapatın.
Kurmadan önce izinleri okuyun. Bu eklentilerin çoğu "Tüm web sitelerindeki tüm verilerinizi okuma ve değiştirme" izni ister. Bu izin, eklentinin açtığınız her sayfayı görmesine imkân verir. Yorumlara, son güncelleme tarihine ve geliştiriciye bakın, iş bitince eklentiyi kaldırın.
Firefox'ta Sayfa Bilgileri penceresiyle tüm resimleri kaydetme
Firefox'ta bunun için yerleşik bir yol var. Ctrl+I (Mac'te Cmd+I) ile Sayfa Bilgileri penceresini açın, ardından Ortam sekmesine geçin.
Listede sayfanın kullandığı her resim, arka planlar ve simgeler dahil, adresi ve türüyle görünür. Tümünü seç düğmesine, sonra Farklı kaydet… düğmesine tıklayıp bir klasör seçin. Ardından bazı simgeleri elle silmeniz gerekecek.
DevTools ile bir resmin gerçek adresi nasıl bulunur?
DevTools (geliştirici araçları), Chrome'a yerleşik ve sayfanın yüklediği her şeyi gösteren bir paneldir. Tam boy dosyayı burada bulursunuz.
- F12 tuşuna basın ve Ağ (Network) sekmesini açın.
- Resim filtresine tıklayın (İngilizce arayüzde Img). Tür filtrelerinin tamamı Chrome'un Ağ paneli referansında listeleniyor.
- Sayfayı yenileyin ve en alta kadar kaydırın. DevTools istekleri yalnız açıkken kaydeder.
- Her satırda dosya adı, türü (webp, avif, jpeg) ve boyutu görünür. Önizleme için satıra tıklayın.
- Satıra sağ tıklayıp Kopyala > URL'yi kopyala komutunu seçin (İngilizce arayüzde Copy > Copy URL). Adresi yeni sekmede açın ve resmi orada kaydedin.
Tek bir resim için resme sağ tıklayıp İncele komutunu seçin. Resmin img etiketinde bir srcset özniteliği varsa, bu öznitelik aynı resmin birkaç kopyasını her birinin yanında genişliğiyle listeler: photo-400.jpg 400w, photo-1600.jpg 1600w gibi. En büyük sayı en büyük kopyayı gösterir.
Sayfa kaynağında (Ctrl+U) ".jpg" aramak birçok resmi kaçırır. Kaynak, sunucunun ilk gönderdiği HTML'dir; JavaScript ile sonradan eklenen resimler orada yoktur.
Resimler neden küçük, bulanık iniyor ya da hiç inmiyor?
1. Tarayıcınız küçük bir kopya seçti. Site, srcset ile aynı resmi birkaç genişlikte listeler. MDN'nin img öğesi referansına göre tarayıcı bu kaynaklardan birini kendi takdirine göre seçer. Dar bir pencerede genellikle küçük olanı alır, siz de onu kaydedersiniz.
2. Resim henüz yüklenmemişti. loading="lazy" taşıyan bir etiket, resim ekrana yaklaşana kadar yüklemeyi bekletir. Bazı siteler ise gerçek adresi data-src özniteliğinde tutar ve bir betik onu yerine koyana kadar boş ya da bulanık bir yer tutucu gösterir. İlk yüklemeden sonra sayfayı JavaScript ile dolduran mekanizma da budur (Statik ve Dinamik Sayfalar: Headless Tarayıcı Gerekir mi?).
3. Küçük önizleme ile tam boy resim ayrı dosyalardır. Web scraping (veri kazıma) alıştırması için kurulmuş books.toscrape.com sitesinde "A Light in the Attic" kitabının kapağı ana sayfada 125 × 155 piksel, kitabın kendi sayfasında 318 × 395 pikseldir.
4. Adres küçük bir kopya istiyor. Birçok resim CDN'i boyutu adrese yazar (?w=400 gibi) ve resmi buna göre küçültür.
Çözüm için pencereyi genişletin, sayfanın tamamını kaydırın, kaydetmeden önce galerideki büyük resmi açın ya da DevTools'ta srcset içindeki en büyük kopyayı alın.
WebP ya da AVIF olarak inen resimler nasıl açılır?
WebP ve AVIF, JPEG'den daha küçük dosyalar üreten yeni biçimlerdir. MDN'nin görsel biçimleri rehberine göre kayıplı WebP resimleri, benzer sıkıştırma düzeyindeki JPEG'lerden ortalama %25-35 daha küçüktür ve güncel tarayıcılar WebP'yi geniş ölçüde destekler.
Aynı adres, farklı programlara farklı biçim gönderebilir. Bir resim CDN'ine aynı adres için iki istek gönderdik. Düz istek JPEG döndürdü. Chrome'un gönderdiği Accept header'ını (tarayıcının hangi biçimleri açabildiğini sunucuya bildiren başlık) taşıyan istek ise AVIF döndürdü. Beklediğiniz .jpg dosyasının .webp ya da .avif olarak inmesinin nedeni budur.
Windows 11'de Paint WebP dosyalarını açar: Dosya > Farklı kaydet yolundan JPEG'i seçin. AVIF dosyaları için Microsoft Store'daki ücretsiz AV1 Video Uzantısı gerekebilir. Onlarca dosya varsa toplu bir resim dönüştürücü işi tek seferde yapar.
İleri seviye: Python ile sayfadaki resimleri indirme
Bu isteğe bağlı bölüm, aynı işi tekrar tekrar yapanlar içindir; örneğin kendi sitesinin görsellerini her ay yedekleyenler. Python 3.10 ya da daha yeni bir sürüm ve pip install requests beautifulsoup4 gerekir. Betik şunları yapar:
- betiğin adını ve bir iletişim adresini taşıyan bir
User-Agent(programın kendini sunucuya tanıttığı header) gönderir (User-Agent Nedir, Nasıl Öğrenilir ve Değiştirilir?); - her
imgvepicture sourceetiketini okur;data-srcsetya dasrcsetiçindeki en büyük adayı, yoksadata-srcya dasrcdeğerini alır; - satır içi
data:yer tutucularını atlar ve../img/photo.jpggibi göreli adresleri tamamlar; - her dosyayı Requests dokümantasyonunun önerdiği gibi bir
withbloğu içinde parça parça indirir; durumu200olmayan ya da türüimage/ile başlamayan her şeyi atlar; - hiçbir dosyanın üzerine yazmaz (ikinci
photo.jpg,photo-1.jpgolur) ve atlananlar dahil her adresten sonra bir saniye bekler.
import mimetypes
import time
from pathlib import Path
from urllib.parse import urljoin, urlsplit
import requests
from bs4 import BeautifulSoup
PAGE_URL = "https://example.com/gallery/" # sahibi olduğunuz ya da kopyalama izniniz olan bir sayfa
FOLDER = Path("images")
DELAY = 1.0 # indirmeler arasındaki bekleme (saniye)
HEADERS = {"User-Agent": "image-backup/1.0 (contact: you@example.com)"}
def largest_candidate(srcset):
"""srcset içinde w ya da x değeri en büyük olan adresi döndürür."""
best_url, best_size = None, -1.0
for part in srcset.split(","):
bits = part.split()
if not bits:
continue
size = 1.0
if len(bits) > 1 and bits[1][-1] in "wx":
size = float(bits[1][:-1])
if size > best_size:
best_url, best_size = bits[0], size
return best_url
def image_urls(html, base_url):
soup = BeautifulSoup(html, "html.parser")
urls = []
for tag in soup.select("img, picture source"):
srcset = tag.get("data-srcset") or tag.get("srcset")
url = largest_candidate(srcset) if srcset else None
url = url or tag.get("data-src") or tag.get("src")
if url and not url.startswith("data:"): # satır içi yer tutucuları atla
full = urljoin(base_url, url)
if full not in urls:
urls.append(full)
return urls
def free_name(url, content_type):
"""Önceki bir indirmenin üzerine yazmayan bir dosya adı seçer."""
name = Path(urlsplit(url).path).name or "image"
stem, suffix = Path(name).stem, Path(name).suffix
if not suffix:
suffix = mimetypes.guess_extension(content_type.split(";")[0]) or ".img"
target, n = FOLDER / f"{stem}{suffix}", 1
while target.exists():
target, n = FOLDER / f"{stem}-{n}{suffix}", n + 1
return target
FOLDER.mkdir(exist_ok=True)
with requests.Session() as session:
session.headers.update(HEADERS)
page = session.get(PAGE_URL, timeout=15)
page.raise_for_status()
for url in image_urls(page.text, page.url):
try:
with session.get(url, stream=True, timeout=30) as r:
ctype = r.headers.get("Content-Type", "")
if r.status_code != 200 or not ctype.startswith("image/"):
print("skipped", r.status_code, ctype, url)
continue
target = free_name(url, ctype)
with open(target, "wb") as f:
for chunk in r.iter_content(chunk_size=64 * 1024):
f.write(chunk)
print("saved", target.name)
except requests.RequestException as exc:
print("failed", url, type(exc).__name__)
finally:
time.sleep(DELAY) # atlanan bir dosyadan sonra da çalışırBetiği Python 3.13, Requests 2.34.2 ve Beautiful Soup 4.15.0 ile yerel bir test sayfasında çalıştırdık. 400w kopya yerine 1600w kopyayı seçti, bir data: yer tutucusunun arkasındaki adresi buldu, iki photo.jpg dosyasını ayrı tuttu ve bir 404 yanıtını atladı. books.toscrape.com'da ana sayfadaki 20 küçük resmi kaydetti. Her çalıştırmaya boş bir klasörle başlayın.
Betikte yeniden deneme yok: sunucu 429 döndürürse önce Scraping'de HTTP Hata Kodları yazısını okuyun. Paralel indirme (Concurrency ve Parallelism: Scraping Hızını Ne Belirler?) ve proxy de bilerek dışarıda kaldı, çünkü kendi sitenizi yedeklemek ikisini de gerektirmez. Göreli adresler sayfalama ve göreli linkler yazısında, öznitelik okuma BeautifulSoup rehberimizde anlatılıyor. Terminal kullananlar, siteyi yormadan özyinelemeli indirme seçeneklerini wget ile Proxy Kullanımı yazısında bulabilir.
Kullanım alanları
- Kendi sitenizi taşımak. Önce CMS'inizde (sitenizi yönettiğiniz içerik yönetim sistemi) bir medya dışa aktarma seçeneği olup olmadığına bakın (Web Sitesinden Veri Çekme).
- Basın kiti. Kurumlar gazeteciler için etkinlik fotoğrafları ve logolar yayınlar, çoğu zaman da kaynak göstermeyle ilgili koşullar koyar (Web Scraping (Web Kazıma) Yasal mı?).
- Açık lisanslı arşivler. Lisansın istediği atfı koruyun ve betikle indirmeden önce sitenin robots.txt dosyasını okuyun.
- Kendi mağazanızı denetlemek. Betik hata döndüren her resmi ekrana yazar; böylece bozuk ürün fotoğraflarının listesini hızlıca çıkarırsınız (Scraping'de HTTP Hata Kodları).
- Kendi sitenizin çok sayıda sayfası. Sitemap'in (site haritası) verdiği sayfa listesiyle başlayın (Sitemap Nasıl Bulunur?).
Sık yapılan hatalar
- Kaydırmadan kaydetmek. Kaydırınca yüklenen resimler eksik kalır.
- Küçük önizlemeyi orijinal sanmak.
- İndirme sorusunu açık bırakmak. Her resim için bir kaydetme penceresini tek tek onaylarsınız.
- İzinlerini okumadan eklenti kurmak.
- Dosyaların birbirinin üzerine yazmasına izin vermek. Bir sitedeki iki ayrı klasörde de
photo.jpgadlı dosya olabilir. - İndirilen resmin kullanım hakkıyla birlikte geldiğini sanmak. Sahibinin koşullarına ya da lisansa bakın.
- Betiği beklemesiz çalıştırmak. Tek bir adresten dakikada yüzlerce istek küçük bir siteyi yavaşlatabilir ve sunucu 429 Too Many Requests cevabı verebilir.
Karar rehberi
| İhtiyaç | Öneri |
|---|---|
| Tek sayfadaki bütün resimler, hiçbir şey kurmadan | En alta kaydırın, sonra Chrome'da Sayfayı farklı kaydet > Web Sayfası, Tamamı |
| Birkaç sayfadan simgeler olmadan resimler | Genişlik filtreli bir toplu resim indirme eklentisi; izinlerine bakın, iş bitince kaldırın |
| Firefox, eklentisiz | Ctrl+I > Ortam > Tümünü seç > Farklı kaydet… |
| Bir resmin orijinal boyutu | DevTools > Ağ > Resim ya da srcset içindeki en büyük aday |
| Dosyalar WebP ya da AVIF iniyor, JPG lazım | Paint'te açıp JPEG olarak kaydedin; çok dosya için toplu dönüştürücü |
| Kendi sitenizin resimlerini her ay yedeklemek | CMS'inizin medya dışa aktarması, yoksa Python betiği |
| Bir sitenin bütün sayfalarındaki resimler | Tarama (crawl): önce izin ve robots.txt, sonra wget'in toplu indirme seçenekleri |
Tablonun üst satırlarındaki yollar en az hazırlığı ister.
Sıkça sorulan sorular
Toplu resim indirme eklentileri güvenli mi?
Olabilir, ama çoğu ziyaret ettiğiniz her sitedeki verileri okuma ve değiştirme izni ister; e-posta hesabınız ve internet bankacılığınız da buna dahildir. Çok yorum almış, yakın zamanda güncellenmiş ve geliştiricisi belli olan bir eklenti seçin, işiniz bitince kaldırın.
Resimler neden WebP olarak iniyor?
Site, dosyalar daha küçük olduğu için WebP ya da AVIF gönderir; tarayıcınız da sunucuya bu biçimleri gösterebildiğini bildirir. Güncel tarayıcılar ve Windows 11'deki Paint WebP dosyalarını açar, Paint bunları JPEG olarak da kaydedebilir.
Resimler neden tam boy inmiyor?
Sayfa büyük ihtimalle ekranınıza daha küçük bir srcset kopyası verdi ya da siz galerideki küçük önizlemeyi kaydettiniz. Pencereyi genişletin, büyük resmi açın ya da DevTools'ta en büyük adayı alın. Site yalnız küçük kopyalar yayınlıyorsa daha büyük bir dosya yoktur.
Telefonda bir sayfadaki tüm resimleri indirebilir miyim?
Android'deki standart Chrome uygulamasıyla tek seferde indiremezsiniz. Resimleri tek tek kaydedebilirsiniz: Google'ın Android yardım sayfasında anlatıldığı gibi resme dokunup basılı tutun, ardından Resmi indir seçeneğine dokunun. Bir sayfanın tamamı için bilgisayar kullanın.
Bir sitenin tüm sayfalarındaki resimleri tek seferde indirebilir miyim?
Bu bir sayfa kaydı değil, taramadır (crawl), yani sayfadan sayfaya linkleri izleyen bir programın işidir (Web Scraping ve Web Crawling Farkı Nedir?). İzin alın, robots.txt dosyasını okuyun ve wget ile Proxy Kullanımı yazısının toplu indirme bölümündekiler gibi siteyi yormayan ayarlar kullanın. Ölçekli tarama gereken işletmeler web crawler çözümümüze bakabilir.
İndirdiğim resimleri kendi sitemde kullanabilir miyim?
Yalnız hakkınız varsa. İndirmek size bir kopya verir, lisans vermez. Kendi fotoğraflarınızı kullanabilirsiniz. Basın kiti resimleri kitin koşullarına, açık lisanslı resimler de çoğu zaman kaynak göstermeyi şart koşan lisanslarına tabidir (Web Scraping (Web Kazıma) Yasal mı?).
Özet
Bir sayfadaki tüm resimleri indirmek için önce en alta kadar kaydırın. Sonra sayfayı Chrome'da "Web Sayfası, Tamamı" seçeneğiyle kaydedin, bir toplu resim indirme eklentisi kullanın ya da Firefox'un Sayfa Bilgileri penceresini açın. Küçük inen resim genellikle daha küçük bir srcset kopyası ya da henüz yüklenmemiş bir resim demektir; tam boy adresi DevTools gösterir. Kullanma hakkınız olan resimlerle sınırlı kalın. İşletmeniz düzenli ve ölçekli resim toplamaya ihtiyaç duyuyorsa veri kazıma çözümlerimize göz atın.




