dealfront_enrichment.py aktualisiert
This commit is contained in:
@@ -122,31 +122,37 @@ class DealfrontScraper:
|
|||||||
logger.info("Extrahiere Ergebnisse mit direkten CSS-Selektoren...")
|
logger.info("Extrahiere Ergebnisse mit direkten CSS-Selektoren...")
|
||||||
results = []
|
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"
|
company_name_selector = ".sticky-column a.t-highlight-text"
|
||||||
logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'")
|
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)))
|
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, company_name_selector)))
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
# Extraktion aller Elemente
|
time.sleep(3) # Letzte, kurze Pause, um sicherzustellen, dass alle Elemente gerendert sind.
|
||||||
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.")
|
# 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)
|
||||||
|
|
||||||
num_results = min(len(company_elements), len(website_elements))
|
if not rows:
|
||||||
if num_results == 0:
|
logger.warning("Keine Datenzeilen gefunden. Speichere Debug-Artefakte.")
|
||||||
logger.warning("Keine Firmen oder Webseiten gefunden.")
|
|
||||||
self._save_debug_artifacts()
|
self._save_debug_artifacts()
|
||||||
return []
|
return []
|
||||||
|
|
||||||
for i in range(num_results):
|
logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.")
|
||||||
company_name = company_elements[i].get_attribute("title").strip()
|
|
||||||
website = website_elements[i].text.strip()
|
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:
|
if company_name and website:
|
||||||
results.append({'name': company_name, 'website': 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 erfolgreich zugeordnet.")
|
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
|
||||||
return results
|
return results
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -161,7 +167,7 @@ class DealfrontScraper:
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
logger.info("Starte Dealfront Automatisierung - DEBUG-MODUS")
|
logger.info("Starte Dealfront Automatisierung - Finaler Durchlauf")
|
||||||
scraper = None
|
scraper = None
|
||||||
try:
|
try:
|
||||||
scraper = DealfrontScraper()
|
scraper = DealfrontScraper()
|
||||||
@@ -171,31 +177,33 @@ if __name__ == "__main__":
|
|||||||
if not scraper.login_and_find_list(TempConfig.TARGET_SEARCH_NAME):
|
if not scraper.login_and_find_list(TempConfig.TARGET_SEARCH_NAME):
|
||||||
raise Exception("Der Prozess vom Login bis zum Laden der Liste ist fehlgeschlagen.")
|
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() # Vorerst deaktiviert, um Fehlerquellen zu minimieren
|
||||||
# scraper.handle_overlays()
|
|
||||||
|
|
||||||
companies = scraper.extract_current_page_results()
|
companies = scraper.extract_current_page_results()
|
||||||
|
|
||||||
if companies:
|
if companies:
|
||||||
df = pd.DataFrame(companies)
|
df = pd.DataFrame(companies)
|
||||||
pd.set_option('display.max_rows', None)
|
pd.set_option('display.max_rows', None)
|
||||||
pd.set_option('display.max_columns', 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)
|
pd.set_option('display.max_colwidth', None)
|
||||||
|
|
||||||
print("\n" + "="*80)
|
print("\n" + "="*80)
|
||||||
print(" EXTRAHIERTE FIRMEN (ERSTE SEITE) ".center(80, "="))
|
print(" EXTRAHIERTE FIRMEN (ERSTE SEITE) ".center(80, "="))
|
||||||
print("="*80)
|
print("="*80)
|
||||||
print(df.to_string(index=False))
|
print(df.to_string(index=False))
|
||||||
print("="*80 + "\n")
|
print("="*80 + "\n")
|
||||||
|
logger.info(f"Testlauf ERFOLGREICH. {len(df)} Firmen extrahiert.")
|
||||||
else:
|
else:
|
||||||
logger.warning("Obwohl die Seite geladen wurde, konnten keine Firmen extrahiert werden.")
|
logger.warning("PROZESS ABGESCHLOSSEN, ABER KEINE FIRMEN EXTRAHIERT. Bitte HTML-Dump im 'output'-Ordner prüfen.")
|
||||||
|
|
||||||
logger.info("Test erfolgreich abgeschlossen. Warte vor dem Schließen...")
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.critical(f"Ein kritischer Fehler ist im Hauptprozess aufgetreten: {e}", exc_info=False)
|
logger.critical(f"Ein kritischer Fehler ist im Hauptprozess aufgetreten: {e}", exc_info=False)
|
||||||
finally:
|
finally:
|
||||||
if scraper:
|
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()
|
scraper.close()
|
||||||
|
|
||||||
logger.info("Dealfront Automatisierung beendet.")
|
logger.info("Dealfront Automatisierung beendet.")
|
||||||
Reference in New Issue
Block a user