diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 742013b3..ff0283fb 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -122,31 +122,37 @@ class DealfrontScraper: logger.info("Extrahiere Ergebnisse mit direkten CSS-Selektoren...") results = [] - # Warten, bis das erste Firmenelement vorhanden ist. + # Warten, bis das erste Element, das wir suchen (ein Firmenname), vorhanden ist. company_name_selector = ".sticky-column a.t-highlight-text" logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'") self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, company_name_selector))) - time.sleep(3) + + time.sleep(3) # Letzte, kurze Pause, um sicherzustellen, dass alle Elemente gerendert sind. - # Extraktion aller Elemente - company_elements = self.driver.find_elements(By.CSS_SELECTOR, company_name_selector) - website_elements = self.driver.find_elements(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text") - - logger.info(f"{len(company_elements)} Firmennamen und {len(website_elements)} Webseiten-Elemente gefunden.") - - num_results = min(len(company_elements), len(website_elements)) - if num_results == 0: - logger.warning("Keine Firmen oder Webseiten gefunden.") + # Finde alle Tabellenzeilen, die eine ID haben. Das ist unser neuer, stabiler Anker. + rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") + rows = self.driver.find_elements(*rows_selector) + + if not rows: + logger.warning("Keine Datenzeilen gefunden. Speichere Debug-Artefakte.") self._save_debug_artifacts() return [] - for i in range(num_results): - company_name = company_elements[i].get_attribute("title").strip() - website = website_elements[i].text.strip() - if company_name and website: - results.append({'name': company_name, 'website': website}) + logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.") - logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.") + for i, row in enumerate(rows, 1): + try: + # Innerhalb jeder Zeile suchen wir nach den spezifischen Links. + company_name = row.find_element(By.CSS_SELECTOR, company_name_selector).get_attribute("title").strip() + website = row.find_element(By.CSS_SELECTOR, "td:nth-of-type(3) a").text.strip() + + if company_name and website: + results.append({'name': company_name, 'website': website}) + except NoSuchElementException: + logger.warning(f"Zeile {i}: Name oder Webseite nicht extrahierbar. Überspringe.") + continue + + logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.") return results except Exception as e: @@ -161,7 +167,7 @@ class DealfrontScraper: if __name__ == "__main__": - logger.info("Starte Dealfront Automatisierung - DEBUG-MODUS") + logger.info("Starte Dealfront Automatisierung - Finaler Durchlauf") scraper = None try: scraper = DealfrontScraper() @@ -171,31 +177,33 @@ if __name__ == "__main__": if not scraper.login_and_find_list(TempConfig.TARGET_SEARCH_NAME): raise Exception("Der Prozess vom Login bis zum Laden der Liste ist fehlgeschlagen.") - # In dieser Version gibt es keine handle_overlays Methode mehr - # scraper.handle_overlays() + # scraper.handle_overlays() # Vorerst deaktiviert, um Fehlerquellen zu minimieren companies = scraper.extract_current_page_results() + if companies: df = pd.DataFrame(companies) pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None) - pd.set_option('display.width', 1000) + pd.set_option('display.width', 120) pd.set_option('display.max_colwidth', None) + print("\n" + "="*80) print(" EXTRAHIERTE FIRMEN (ERSTE SEITE) ".center(80, "=")) print("="*80) print(df.to_string(index=False)) print("="*80 + "\n") + logger.info(f"Testlauf ERFOLGREICH. {len(df)} Firmen extrahiert.") else: - logger.warning("Obwohl die Seite geladen wurde, konnten keine Firmen extrahiert werden.") - - logger.info("Test erfolgreich abgeschlossen. Warte vor dem Schließen...") - time.sleep(10) + logger.warning("PROZESS ABGESCHLOSSEN, ABER KEINE FIRMEN EXTRAHIERT. Bitte HTML-Dump im 'output'-Ordner prüfen.") except Exception as e: logger.critical(f"Ein kritischer Fehler ist im Hauptprozess aufgetreten: {e}", exc_info=False) finally: if scraper: + # Wir lassen den Browser für 15 Sekunden offen, um das Ergebnis zu sehen + logger.info("Prozess beendet. Browser bleibt zur Inspektion 15 Sekunden geöffnet...") + time.sleep(15) scraper.close() logger.info("Dealfront Automatisierung beendet.") \ No newline at end of file