import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import threading
import psutil
import os
from datetime import datetime
import time
# ===================== AYARLAR =====================
CHROME_PATH = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
USER_DATA_DIR = r"C:\Users\İlayda\AppData\Local\Google\Chrome\User Data"
PROFILE_NAME = "Profile 6"
CHROMEDRIVER_PATH = r"C:\CD\chromedriver.exe"
INSTAGRAM_URL = "https://www.instagram.com/"
DOWNLOAD_XPATH = "/html/body/div[6]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[1]/span[4]/div/div[1]"
LOG_FILE = os.path.join(os.getcwd(), "instagram_log.txt")
# ===================================================
class InstagramDownloader:
def __init__(self, root):
self.root = root
self.driver = None
self.log_file = None
self.setup_ui()
self.setup_log()
def setup_ui(self):
self.root.title("Instagram Downloader")
self.root.geometry("800x600")
main_frame = ttk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
control_frame = ttk.Frame(main_frame)
control_frame.pack(fill=tk.X)
ttk.Button(control_frame, text="Başlat", command=self.start_process).pack(side=tk.LEFT)
ttk.Button(control_frame, text="Chrome Tümünü Kapat", command=self.close_all_chrome).pack(side=tk.LEFT, padx=10)
ttk.Label(control_frame, text="Yeni Sekme Sayısı:").pack(side=tk.LEFT, padx=10)
self.tab_count_var = tk.IntVar(value=1)
ttk.Entry(control_frame, width=5, textvariable=self.tab_count_var).pack(side=tk.LEFT)
ttk.Button(control_frame, text="Yeni Sekmeler Aç", command=self.open_new_tabs).pack(side=tk.LEFT, padx=10)
self.status_label = ttk.Label(control_frame, text="Hazır", foreground="blue")
self.status_label.pack(side=tk.LEFT, padx=10)
self.log_text = scrolledtext.ScrolledText(main_frame, wrap=tk.WORD)
self.log_text.pack(fill=tk.BOTH, expand=True)
ttk.Label(main_frame, text=f"Log dosyası: {LOG_FILE}", foreground="green").pack()
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
def setup_log(self):
try:
self.log_file = open(LOG_FILE, "a", encoding="utf-8")
self.write_log(f"\n\n===== Oturum Başladı ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) =====")
except Exception as e:
messagebox.showerror("Log Hatası", str(e))
def write_log(self, msg):
timestamp = datetime.now().strftime("[%H:%M:%S]")
full_msg = f"{timestamp} {msg}"
try:
self.log_text.insert(tk.END, full_msg + "\n")
self.log_text.see(tk.END)
except:
pass
if self.log_file:
try:
self.log_file.write(full_msg + "\n")
self.log_file.flush()
except:
pass
def update_status(self, msg, color="blue"):
self.status_label.config(text=msg, foreground=color)
def start_process(self):
threading.Thread(target=self.run_browser, daemon=True).start()
def run_browser(self):
try:
self.update_status("Başlatılıyor...", "orange")
self.write_log("Başlatılıyor...")
# Chrome açık mı kontrol et
if self.is_chrome_open():
self.write_log("Mevcut Chrome açık, kapatılmayacak.")
else:
self.write_log("Chrome açık değil, yeni profille açılıyor.")
options = Options()
options.binary_location = CHROME_PATH
options.add_argument(f"user-data-dir={USER_DATA_DIR}")
options.add_argument(f"--profile-directory={PROFILE_NAME}")
options.add_argument("--start-maximized")
options.add_argument("--disable-blink-features=AutomationControlled")
service = Service(CHROMEDRIVER_PATH)
self.driver = webdriver.Chrome(service=service, options=options)
# Driver başarıyla oluşturuldu mu kontrol et
if self.driver:
self.write_log("WebDriver başarıyla oluşturuldu")
self.update_status("Chrome açıldı", "green")
else:
raise Exception("WebDriver oluşturulamadı")
self.write_log(f"{INSTAGRAM_URL} adresine gidiliyor...")
self.driver.get(INSTAGRAM_URL)
self.write_log("İndirme butonu bekleniyor...")
button = WebDriverWait(self.driver, 30).until(
EC.element_to_be_clickable((By.XPATH, DOWNLOAD_XPATH))
)
button.click()
self.write_log("Butona tıklandı! İşlem tamamlandı.")
self.update_status("İndirme Başladı!", "green")
except Exception as e:
self.write_log(f"HATA: {str(e)}")
self.update_status("Hata oluştu!", "red")
self.driver = None # Hata durumunda driver'ı None yap
messagebox.showerror("Hata", f"İşlem sırasında hata oluştu:\n\n{str(e)}")
def is_chrome_open(self):
# Chrome.exe çalışan var mı diye bak
for proc in psutil.process_iter(['name']):
if proc.info['name'] and proc.info['name'].lower() == 'chrome.exe':
return True
return False
def close_all_chrome(self):
# Tüm chrome.exe ve chromedriver.exe süreçlerini kapat
count = 0
for proc in psutil.process_iter(['name']):
try:
if proc.info['name'] and proc.info['name'].lower() in ('chrome.exe', 'chromedriver.exe'):
proc.kill()
count += 1
self.write_log(f"Sonlandırıldı: {proc.info['name']}")
except:
pass
self.update_status(f"{count} Chrome işlemi kapatıldı.", "red")
def open_new_tabs(self):
# Driver kontrolü - hem None hem de session kontrolü
if not self.driver:
messagebox.showwarning("Uyarı", "Önce 'Başlat' butonuna basıp Chrome'u açın!")
return
# Driver session'ının hala aktif olup olmadığını kontrol et
try:
self.driver.current_url # Bu, session aktif değilse hata verir
except Exception:
messagebox.showwarning("Uyarı", "Chrome session'ı kapatılmış! Lütfen tekrar 'Başlat' butonuna basın.")
self.driver = None
self.update_status("Chrome session kapatıldı", "red")
return
try:
count = self.tab_count_var.get()
if count < 1:
messagebox.showwarning("Uyarı", "Lütfen 1 veya daha fazla sayı girin.")
return
self.update_status(f"{count} yeni sekme açılıyor...", "orange")
self.write_log(f"{count} yeni sekme açılmaya başlanıyor...")
# Mevcut sekme sayısını al
current_handles = len(self.driver.window_handles)
self.write_log(f"Mevcut sekme sayısı: {current_handles}")
for i in range(count):
try:
# JavaScript ile yeni sekme aç
self.driver.execute_script("window.open('', '_blank');")
time.sleep(1)
# Yeni sekmeye geç
new_handles = self.driver.window_handles
if len(new_handles) > current_handles + i:
self.driver.switch_to.window(new_handles[-1])
# Instagram'a git
self.driver.get("https://www.instagram.com")
self.write_log(f"Sekme {i+1} açıldı ve Instagram'a yönlendirildi")
time.sleep(1)
else:
# Alternatif yöntem: body elementini bul ve Ctrl+T gönder
try:
body = self.driver.find_element(By.TAG_NAME, 'body')
body.send_keys(Keys.CONTROL + 't')
time.sleep(1)
# Yeni sekmeye geç
if len(self.driver.window_handles) > current_handles + i:
self.driver.switch_to.window(self.driver.window_handles[-1])
self.driver.get("https://www.instagram.com")
self.write_log(f"Sekme {i+1} Ctrl+T ile açıldı")
time.sleep(1)
except Exception as ctrl_error:
self.write_log(f"Ctrl+T yöntemi başarısız: {str(ctrl_error)}")
except Exception as tab_error:
self.write_log(f"Sekme {i+1} açılırken hata: {str(tab_error)}")
continue
# Son durumu kontrol et
final_handles = len(self.driver.window_handles)
opened_tabs = final_handles - current_handles
if opened_tabs > 0:
self.update_status(f"{opened_tabs} sekme açıldı.", "green")
self.write_log(f"Toplam {opened_tabs} yeni sekme açıldı. Toplam sekme: {final_handles}")
else:
self.update_status("Sekme açılamadı!", "red")
self.write_log("Hiçbir sekme açılamadı!")
# İlk sekmeye geri dön
if self.driver.window_handles:
self.driver.switch_to.window(self.driver.window_handles[0])
except Exception as e:
self.update_status("Sekme açma hatası!", "red")
self.write_log(f"Sekme açma genel hatası: {str(e)}")
messagebox.showerror("Hata", f"Sekme açılırken hata oluştu:\n{e}")
def on_close(self):
try:
if self.driver:
self.driver.quit()
self.write_log("Chrome kapatıldı.")
except:
pass
try:
if self.log_file:
self.write_log("Uygulama kapatıldı.")
self.log_file.close()
except:
pass
self.root.destroy()
# Ana uygulama başlatıcı
if __name__ == "__main__":
try:
root = tk.Tk()
w, h = 800, 600
sw, sh = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry(f"{w}x{h}+{(sw - w) // 2}+{(sh - h) // 2}")
app = InstagramDownloader(root)
root.mainloop()
except Exception as e:
print(f"Uygulama başlatılırken hata oluştu: {e}") pytonda varolan bir chrome profilinde işlem yapmak
2
●88
- 02-06-2025, 00:30:44Selam dostlar pytonda varolan bir chrome profilinde işlem yapmak istiyorum ama beceremedim örneğim profil 6 yı açıyor ama sekmede işlem yaptırmıyor.
- 02-06-2025, 01:20:09kodda session yönetimi eksik hocam, kodun başında eski sevgilimin adını görünce canlı çalıştırmaya üşendim
direkt attım claude'a cevabını veriyorum. şaka bir yana ne yapmak istediğinizi detaylandırırsanız yardımcı olayım.
Muhtemel sorunlar ve çözümler:- Chrome'un otomasyon algılaması nedeniyle bazı işlemler engellenebilir
- Yeni sekme açma yöntemi düzgün çalışmıyor olabilir
- Instagram'ın bot koruması devreye giriyor olabilir
Kullanıcının sorununu çözmek için kodda birkaç önemli değişiklik yaptım:- Chrome'un otomasyon algılamasını engellemek için ek seçenekler ekledim
- Yeni sekme açma mantığını düzelttim
- Debug modu ekledim
- Test fonksiyonu ekledim
- Hata kontrollerini iyileştirdim
- Chrome'un bot koruması nedeniyle işlem yapılamaması -> Anti-detection ayarları eklendi
- Yeni sekmelerde işlem yapılamaması -> Sekme değiştirme ve bekleme süreleri düzeltildi
- Session yönetimi sorunları -> Daha iyi kontroller eklendi
Ana Sorunlar:
- Chrome'un Otomasyon Algılaması: Instagram, Selenium ile kontrol edildiğini algılıyor
- Sekme Değiştirme Sorunları: Yeni sekmeler açılıyor ama aktif olmuyor
- Bekleme Süreleri: Sayfalar tam yüklenmeden işlem yapılmaya çalışılıyor
Önemli Değişiklikler:
1. Anti-Detection Ayarları:
python options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument("--disable-blink-features=AutomationControlled")2. JavaScript ile navigator.webdriver'ı kaldırma:
python self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")3. Yeni Sekme Açma Düzeltmesi:
python # JavaScript ile açma self.driver.execute_script("window.open('about:blank', '_blank');") time.sleep(1) # Yeni sekmeye geçiş new_tab = new_handles[-1] self.driver.switch_to.window(new_tab) # Instagram'a gitme self.driver.get("https://www.instagram.com")4. Test Fonksiyonu:
Yeni bir "Test Et" butonu ekledim. Bu, aktif sekmede işlem yapabildiğinizi kontrol etmenizi sağlar.
Öneriler:
- ChromeDriver Sürümü: ChromeDriver'ınızın Chrome sürümünüzle uyumlu olduğundan emin olun
- Profil İzinleri: Profile 6'nın doğru izinlere sahip olduğunu kontrol edin
- Instagram Giriş: Önce manuel olarak Profile 6'ya giriş yapın
- Bekleme Süreleri: Gerekirse time.sleep() sürelerini artırın
- "Chrome Başlat" butonuna tıklayın
- Chrome açıldıktan sonra "Test Et" butonuyla işlem yapabildiğinizi kontrol edin
- Ardından "Yeni Sekmeler Aç" butonunu kullanın
import tkinter as tk from tkinter import ttk, messagebox, scrolledtext from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains import threading import psutil import os from datetime import datetime import time import subprocess # ===================== AYARLAR ===================== CHROME_PATH = r"C:\Program Files\Google\Chrome\Application\chrome.exe" USER_DATA_DIR = r"C:\Users\İlayda\AppData\Local\Google\Chrome\User Data" PROFILE_NAME = "Profile 6" CHROMEDRIVER_PATH = r"C:\CD\chromedriver.exe" INSTAGRAM_URL = "https://www.instagram.com/" DOWNLOAD_XPATH = "/html/body/div[6]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[1]/span[4]/div/div[1]" LOG_FILE = os.path.join(os.getcwd(), "instagram_log.txt") # =================================================== class InstagramDownloader: def __init__(self, root): self.root = root self.driver = None self.log_file = None self.debug_mode = True # Debug modu ekledik self.setup_ui() self.setup_log() def setup_ui(self): self.root.title("Instagram Downloader") self.root.geometry("800x600") main_frame = ttk.Frame(self.root) main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) control_frame = ttk.Frame(main_frame) control_frame.pack(fill=tk.X) ttk.Button(control_frame, text="Chrome Başlat", command=self.start_process).pack(side=tk.LEFT) ttk.Button(control_frame, text="Chrome Tümünü Kapat", command=self.close_all_chrome).pack(side=tk.LEFT, padx=10) # Debug modu checkbox self.debug_var = tk.BooleanVar(value=True) ttk.Checkbutton(control_frame, text="Debug Modu", variable=self.debug_var).pack(side=tk.LEFT, padx=10) ttk.Label(control_frame, text="Yeni Sekme Sayısı:").pack(side=tk.LEFT, padx=10) self.tab_count_var = tk.IntVar(value=1) ttk.Entry(control_frame, width=5, textvariable=self.tab_count_var).pack(side=tk.LEFT) ttk.Button(control_frame, text="Yeni Sekmeler Aç", command=self.open_new_tabs).pack(side=tk.LEFT, padx=10) ttk.Button(control_frame, text="Test Et", command=self.test_instagram).pack(side=tk.LEFT, padx=10) self.status_label = ttk.Label(control_frame, text="Hazır", foreground="blue") self.status_label.pack(side=tk.LEFT, padx=10) self.log_text = scrolledtext.ScrolledText(main_frame, wrap=tk.WORD) self.log_text.pack(fill=tk.BOTH, expand=True) ttk.Label(main_frame, text=f"Log dosyası: {LOG_FILE}", foreground="green").pack() self.root.protocol("WM_DELETE_WINDOW", self.on_close) def setup_log(self): try: self.log_file = open(LOG_FILE, "a", encoding="utf-8") self.write_log(f"\n\n===== Oturum Başladı ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) =====") except Exception as e: messagebox.showerror("Log Hatası", str(e)) def write_log(self, msg): timestamp = datetime.now().strftime("[%H:%M:%S]") full_msg = f"{timestamp} {msg}" try: self.log_text.insert(tk.END, full_msg + "\n") self.log_text.see(tk.END) self.root.update() # GUI'yi güncelle except: pass if self.log_file: try: self.log_file.write(full_msg + "\n") self.log_file.flush() except: pass def update_status(self, msg, color="blue"): self.status_label.config(text=msg, foreground=color) self.root.update() def kill_chrome_processes(self): """Chrome ve chromedriver süreçlerini temizle""" killed = 0 for proc in psutil.process_iter(['name']): try: if proc.info['name'] and proc.info['name'].lower() in ('chrome.exe', 'chromedriver.exe'): proc.kill() killed += 1 except: pass return killed def start_process(self): threading.Thread(target=self.run_browser, daemon=True).start() def run_browser(self): try: self.update_status("Chrome başlatılıyor...", "orange") self.write_log("Chrome başlatılıyor...") # Önce var olan Chrome'ları kapat (opsiyonel) if self.debug_var.get(): killed = self.kill_chrome_processes() if killed > 0: self.write_log(f"{killed} Chrome süreci kapatıldı") time.sleep(2) # Süreçlerin kapanması için bekle options = Options() options.binary_location = CHROME_PATH options.add_argument(f"user-data-dir={USER_DATA_DIR}") options.add_argument(f"--profile-directory={PROFILE_NAME}") # Otomasyon algılamayı engelle options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument("--disable-blink-features=AutomationControlled") # Ek güvenlik ayarları options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--start-maximized") # User-Agent ayarla options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") service = Service(CHROMEDRIVER_PATH) self.write_log("WebDriver oluşturuluyor...") self.driver = webdriver.Chrome(service=service, options=options) # JavaScript ile navigator.webdriver'ı kaldır self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") self.write_log("Chrome başarıyla açıldı!") self.update_status("Chrome açıldı", "green") # Instagram'a git self.write_log(f"Instagram'a gidiliyor...") self.driver.get(INSTAGRAM_URL) # Sayfa yüklenmesini bekle time.sleep(5) self.write_log("Instagram sayfası yüklendi") self.update_status("Instagram açıldı", "green") except Exception as e: self.write_log(f"HATA: {str(e)}") self.update_status("Hata oluştu!", "red") self.driver = None messagebox.showerror("Hata", f"Chrome başlatılırken hata oluştu:\n\n{str(e)}") def test_instagram(self): """Instagram'da test işlemi yap""" if not self.driver: messagebox.showwarning("Uyarı", "Önce Chrome'u başlatın!") return try: self.update_status("Test ediliyor...", "orange") # Aktif sekmeyi kontrol et current_url = self.driver.current_url self.write_log(f"Aktif URL: {current_url}") # Instagram'da değilse git if "instagram.com" not in current_url: self.driver.get("https://www.instagram.com") time.sleep(3) # Sayfada bir element bul ve tıkla (örnek) try: # Arama kutusunu bul search_box = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Search']")) ) self.write_log("Arama kutusu bulundu!") # Arama kutusuna tıkla search_box.click() time.sleep(1) # Test metni yaz search_box.send_keys("test") self.write_log("Test metni yazıldı") self.update_status("Test başarılı!", "green") except Exception as e: self.write_log(f"Element bulunamadı: {str(e)}") # Alternatif: Sayfada herhangi bir tıklanabilir element bul try: clickable = self.driver.find_element(By.TAG_NAME, "body") clickable.click() self.write_log("Body elementine tıklandı") except: pass except Exception as e: self.write_log(f"Test hatası: {str(e)}") self.update_status("Test başarısız!", "red") def open_new_tabs(self): """Yeni sekmeler aç ve Instagram'a git""" if not self.driver: messagebox.showwarning("Uyarı", "Önce Chrome'u başlatın!") return try: # Session kontrolü self.driver.current_url except Exception: messagebox.showwarning("Uyarı", "Chrome bağlantısı kopmuş! Tekrar başlatın.") self.driver = None return try: count = self.tab_count_var.get() if count < 1: messagebox.showwarning("Uyarı", "En az 1 sekme açmalısınız.") return self.update_status(f"{count} sekme açılıyor...", "orange") self.write_log(f"{count} yeni sekme açılıyor...") # Mevcut sekmeleri kaydet original_handles = self.driver.window_handles original_count = len(original_handles) # Ana sekmeye odaklan self.driver.switch_to.window(original_handles[0]) successfully_opened = 0 for i in range(count): try: # Yöntem 1: JavaScript ile yeni sekme aç self.driver.execute_script("window.open('about:blank', '_blank');") time.sleep(1) # Yeni sekmeleri kontrol et new_handles = self.driver.window_handles if len(new_handles) > original_count + successfully_opened: # En son açılan sekmeye geç new_tab = new_handles[-1] self.driver.switch_to.window(new_tab) # Instagram'a git self.driver.get("https://www.instagram.com") self.write_log(f"Sekme {i+1} açıldı ve Instagram yüklendi") # Sayfanın yüklenmesini bekle time.sleep(2) # Sayfa başlığını kontrol et title = self.driver.title self.write_log(f"Sekme {i+1} başlığı: {title}") successfully_opened += 1 else: self.write_log(f"Sekme {i+1} açılamadı") except Exception as e: self.write_log(f"Sekme {i+1} hatası: {str(e)}") # İlk sekmeye geri dön self.driver.switch_to.window(original_handles[0]) # Sonuçları bildir self.write_log(f"Toplam {successfully_opened}/{count} sekme başarıyla açıldı") self.update_status(f"{successfully_opened} sekme açıldı", "green" if successfully_opened > 0 else "red") # Tüm sekmeleri listele if self.debug_var.get(): self.write_log("Açık sekmeler:") for idx, handle in enumerate(self.driver.window_handles): self.driver.switch_to.window(handle) self.write_log(f" Sekme {idx+1}: {self.driver.title} - {self.driver.current_url}") # Ana sekmeye dön self.driver.switch_to.window(original_handles[0]) except Exception as e: self.write_log(f"Genel hata: {str(e)}") self.update_status("Sekme açma hatası!", "red") messagebox.showerror("Hata", f"Sekme açılırken hata oluştu:\n{e}") def is_chrome_open(self): for proc in psutil.process_iter(['name']): if proc.info['name'] and proc.info['name'].lower() == 'chrome.exe': return True return False def close_all_chrome(self): count = self.kill_chrome_processes() self.update_status(f"{count} Chrome işlemi kapatıldı.", "red") self.write_log(f"{count} Chrome işlemi kapatıldı") self.driver = None def on_close(self): try: if self.driver: self.driver.quit() self.write_log("WebDriver kapatıldı.") except: pass try: if self.log_file: self.write_log("Uygulama kapatıldı.") self.log_file.close() except: pass self.root.destroy() # Ana uygulama başlatıcı if __name__ == "__main__": try: root = tk.Tk() # Pencereyi ortala w, h = 800, 600 sw, sh = root.winfo_screenwidth(), root.winfo_screenheight() root.geometry(f"{w}x{h}+{(sw - w) // 2}+{(sh - h) // 2}") app = InstagramDownloader(root) root.mainloop() except Exception as e: print(f"Uygulama başlatılırken hata oluştu: {e}") messagebox.showerror("Kritik Hata", f"Uygulama başlatılamadı:\n{e}") - 02-06-2025, 01:39:57kodun biraz fazla karışık aşadaki gibi bir yapı kullan Benim kullandığım "chrome_data_dir" da klasör içindeinsta diye klasör ekle tüm her şeyi otmatik çerezler dahil oraya ekleyecek sorunsuz çalışır.
options = Options()
options.add_argument(f"--user-data-dir=./{chrome_data_dir}") # Kullanıcı verilerinin saklandığı klasör
options.add_argument("--no-sandbox")
options.add_argument("--disable-setuid-sandbox")
options.add_argument("--disable-dev-shm-using")
options.add_argument("--disable-gpu")
options.add_argument("disable-infobars")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = webdriver.Chrome(options=options)
direkt attım claude'a cevabını veriyorum. şaka bir yana ne yapmak istediğinizi detaylandırırsanız yardımcı olayım.