Selam arkadaşlar, bi projem için pinterestten görsel çekmem gerekiyordu,

bi kullanıcının PIN lediği 403 resimden 249 tanesini çekebildim.

Arama da çıkan sonuçları, kişinin pinlediği resimleri farketmeksizin, vereceğiniz pinterest url sindeki resimleri çeker

Pinterest pano URL: [url]https://tr.pinterest.com/[/url]...
Kaç resim indirilsin? (hepsi için boş bırak):
python çalışıtıryıorsunuz, login olup enter a basıyorsunuz ardından orijinal boyutlarından webp bakıp jpg olarak kaydediyor.

tamamını indirememiş olsa da 403 te 249 çok iyi bir rakam.

Searcha yazdığım bi kelime için 2200 indirme yaptı.

ihtiyacı olanlar için :

import os
import re
import time
import requests
from playwright.sync_api import sync_playwright

SAVE_DIR = "downloads"


def highest_quality(url):
    # webp80/originals → düz jpg'ye çevir
    url = re.sub(r"https://i\.pinimg\.com/webp80/originals/", "https://i.pinimg.com/originals/", url)
    url = re.sub(r"https://i\.pinimg\.com/webp80/\d+x/", "https://i.pinimg.com/originals/", url)
    # Thumbnail boyutlarını originals'a çevir
    url = re.sub(r"/\d+x/", "/originals/", url)
    url = url.replace("/236x/", "/originals/")
    url = url.replace("/474x/", "/originals/")
    url = url.replace("/564x/", "/originals/")
    # .webp uzantısını .jpg yap
    url = re.sub(r"\.webp$", ".jpg", url)
    return url


HEADERS = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Referer": "https://www.pinterest.com/",
    "Accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
    "Accept-Language": "tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7",
    "sec-fetch-dest": "image",
    "sec-fetch-mode": "no-cors",
    "sec-fetch-site": "cross-site",
}


def download(url, path):
    try:
        r = requests.get(url, headers=HEADERS, timeout=30)
        if r.status_code == 200:
            with open(path, "wb") as f:
                f.write(r.content)
            return True
        else:
            print(f"  ✗ {r.status_code}: {url}")
    except Exception as e:
        print(f"  ✗ hata: {e}")
    return False


def main(board_url, limit=None):
    os.makedirs(SAVE_DIR, exist_ok=True)

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)

        page = browser.new_page(viewport={"width": 1400, "height": 900})

        print("Pinterest açılıyor...")
        page.goto("https://www.pinterest.com/login/", wait_until="domcontentloaded", timeout=60000)

        print("\n⏳ Giriş yap, sonra terminal'e dön ve Enter'a bas...")
        input("  [Enter] = hazır, devam et: ")

        print(f"Pano açılıyor: {board_url}")
        page.goto(board_url, wait_until="domcontentloaded", timeout=60000)
        time.sleep(3)

        print("Tüm pinler yükleniyor...")

        last_height = 0
        same_count = 0
        scroll_round = 0
        seen = set()
        urls = []

        while True:
            # Scroll sırasında mevcut resimleri topla (virtual DOM'dan kaybolmadan önce)
            imgs = page.locator("img").evaluate_all(
                "els => els.map(e => e.src).filter(Boolean)"
            )
            for url in imgs:
                if "pinimg.com" not in url:
                    continue
                url = highest_quality(url)
                if url not in seen:
                    seen.add(url)
                    urls.append(url)

            page.mouse.wheel(0, 20000)
            time.sleep(2.5)

            height = page.evaluate("document.body.scrollHeight")
            scroll_round += 1

            print(f"  scroll #{scroll_round} — yükseklik: {height}px, toplam url: {len(urls)}")

            if height == last_height:
                same_count += 1
            else:
                same_count = 0

            last_height = height

            if same_count >= 8:
                break

        browser.close()

    if limit:
        urls = urls[:limit]

    print(f"{len(urls)} benzersiz resim bulundu.")

    count = 1

    for url in urls:
        ext = ".jpg"
        if ".png" in url:
            ext = ".png"
        # webp varsa jpg olarak kaydet (zaten URL'de dönüştürüldü)

        filename = os.path.join(SAVE_DIR, f"{count:04d}{ext}")

        if download(url, filename):
            print(f"✓ {filename}")
            count += 1

    print("Tamamlandı.")


if __name__ == "__main__":
    board = input("Pinterest pano URL: ").strip()
    limit_str = input("Kaç resim indirilsin? (hepsi için boş bırak): ").strip()
    limit = int(limit_str) if limit_str.isdigit() else None
    main(board, limit)