erweitertes Log. Seitenzugriff klappt jetzt

This commit is contained in:
2025-07-04 04:59:07 +00:00
parent 690472e799
commit 01a6ff694d

View File

@@ -16,9 +16,23 @@ from config import Config, DEALFRONT_LOGIN_URL, DEALFRONT_CREDENTIALS_FILE, DEAL
# Logging-Konfiguration
LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO
LOG_FORMAT = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s'
# Root-Logger konfigurieren (gilt für alle Bibliotheken)
logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, force=True)
# Logger für Selenium auf INFO setzen, um Spam zu vermeiden
logging.getLogger("selenium").setLevel(logging.INFO)
# Logger für unser eigenes Skript
logger = logging.getLogger(__name__)
# FileHandler hinzufügen, um in eine Datei zu loggen
log_filename = f"dealfront_run_{time.strftime('%Y%m%d-%H%M%S')}.log"
log_filepath = os.path.join(OUTPUT_DIR, log_filename)
file_handler = logging.FileHandler(log_filepath, mode='w', encoding='utf-8')
file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
logging.getLogger().addHandler(file_handler)
OUTPUT_DIR = "/app/output"
class DealfrontScraper:
@@ -209,42 +223,40 @@ class DealfrontScraper:
def extract_current_page_results(self):
"""
Extrahiert die Firmennamen und Webseiten von der aktuellen Ergebnisseite
unter Verwendung der verifizierten und präzisen CSS-Selektoren.
mit einem finalen, robusten XPath-Selektor.
"""
try:
logger.info("Extrahiere Ergebnisse von der aktuellen Seite...")
results = []
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody > tr[id]")
self.wait.until(EC.presence_of_element_located(rows_selector))
time.sleep(3)
# Warten, bis die Tabelle (bzw. ihr Body) da ist
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody")))
time.sleep(3) # Letzte Pause, um das Rendern abzuwarten
# Dieser XPath sucht nach allen `tr`-Elementen, die eine Zelle (td) enthalten,
# welche wiederum ein Element mit einem 'data-userpilot-id' Attribut hat, das mit 'company-name-cell' beginnt.
# Das ist ein sehr starkes Merkmal für eine Datenzeile.
rows_selector = (By.XPATH, "//table[@id='t-result-table']/tbody/tr[.//div[@data-userpilot-id and starts-with(@data-userpilot-id, 'company-name-cell')]]")
rows = self.driver.find_elements(*rows_selector)
if not rows:
logger.warning("Keine Ergebniszeilen (tr[id]) auf der Seite gefunden.")
logger.warning("Keine Ergebniszeilen gefunden. HTML-Struktur hat sich möglicherweise geändert.")
self._save_debug_artifacts()
return []
logger.info(f"{len(rows)} Ergebniszeilen zur Verarbeitung gefunden.")
logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.")
for i, row in enumerate(rows):
company_name, website = "", ""
for i, row in enumerate(rows, 1):
try:
# --- IHR SELEKTOR FÜR FIRMENNAMEN ---
company_name_element = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text")
company_name = company_name_element.get_attribute("title").strip()
# --- IHR SELEKTOR FÜR WEBSITES ---
website_element = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text")
website = website_element.text.strip()
if company_name and website:
results.append({'name': company_name, 'website': website})
# Wir verwenden die stabilen Selektoren, die Sie identifiziert haben.
company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip()
website = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text").text.strip()
results.append({'name': company_name, 'website': website})
except NoSuchElementException:
logger.warning(f"Zeile {i+1}: Name oder Webseite nicht gefunden. Überspringe.")
logger.warning(f"Zeile {i}: Konnte Name oder Webseite nicht extrahieren. Überspringe.")
continue
logger.info(f"{len(results)} Firmen erfolgreich extrahiert.")
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
return results
except Exception as e: