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 # Logging-Konfiguration
LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO
LOG_FORMAT = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' 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) 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__) 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" OUTPUT_DIR = "/app/output"
class DealfrontScraper: class DealfrontScraper:
@@ -209,42 +223,40 @@ class DealfrontScraper:
def extract_current_page_results(self): def extract_current_page_results(self):
""" """
Extrahiert die Firmennamen und Webseiten von der aktuellen Ergebnisseite 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: try:
logger.info("Extrahiere Ergebnisse von der aktuellen Seite...") logger.info("Extrahiere Ergebnisse von der aktuellen Seite...")
results = [] results = []
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody > tr[id]") # Warten, bis die Tabelle (bzw. ihr Body) da ist
self.wait.until(EC.presence_of_element_located(rows_selector)) self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody")))
time.sleep(3) 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) rows = self.driver.find_elements(*rows_selector)
if not rows: 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() self._save_debug_artifacts()
return [] 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): for i, row in enumerate(rows, 1):
company_name, website = "", ""
try: try:
# --- IHR SELEKTOR FÜR FIRMENNAMEN --- # Wir verwenden die stabilen Selektoren, die Sie identifiziert haben.
company_name_element = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text") company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip()
company_name = company_name_element.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})
# --- 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})
except NoSuchElementException: 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 continue
logger.info(f"{len(results)} Firmen erfolgreich extrahiert.") logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
return results return results
except Exception as e: except Exception as e: