dealfront_enrichment.py aktualisiert
This commit is contained in:
@@ -92,6 +92,19 @@ class DealfrontScraper:
|
|||||||
self._save_debug_artifacts("login_exception")
|
self._save_debug_artifacts("login_exception")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def scroll_table_to_bottom(self):
|
||||||
|
"""
|
||||||
|
Scrollt das Tabellen-Element und die Seite nach unten, damit alle Zeilen sichtbar und geladen sind.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
table = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table")
|
||||||
|
self.driver.execute_script("arguments[0].scrollIntoView(false);", table)
|
||||||
|
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
|
||||||
|
time.sleep(1) # Kurze Pause, damit ggf. Inhalte nachgeladen werden
|
||||||
|
logger.info("Nach Seitenwechsel nach unten gescrollt.")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Fehler beim Scrollen nach unten: {e}")
|
||||||
|
|
||||||
def navigate_and_load_search(self, search_name):
|
def navigate_and_load_search(self, search_name):
|
||||||
try:
|
try:
|
||||||
logger.info(f"Navigiere direkt zur Target-Seite und lade die Suche...")
|
logger.info(f"Navigiere direkt zur Target-Seite und lade die Suche...")
|
||||||
@@ -134,7 +147,7 @@ class DealfrontScraper:
|
|||||||
def scrape_all_pages(self, max_pages=10):
|
def scrape_all_pages(self, max_pages=10):
|
||||||
"""
|
"""
|
||||||
Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Daten,
|
Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Daten,
|
||||||
und sammelt alle Firmenzeilen seitengetreu (keine Deduplizierung).
|
scrollt nach jedem Seitenwechsel nach unten und sammelt alle Firmenzeilen seitengetreu.
|
||||||
"""
|
"""
|
||||||
all_companies = []
|
all_companies = []
|
||||||
for page_number in range(1, max_pages + 1):
|
for page_number in range(1, max_pages + 1):
|
||||||
@@ -145,16 +158,14 @@ class DealfrontScraper:
|
|||||||
logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.")
|
logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.")
|
||||||
break
|
break
|
||||||
|
|
||||||
# Vor dem Klick: Erste Zeilen-ID und Text merken
|
# Vor dem Klick: IDs aller Zeilen merken
|
||||||
try:
|
try:
|
||||||
first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
|
rows_before = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
|
||||||
first_row_id = first_row_element.get_attribute("id")
|
ids_before = [r.get_attribute("id") for r in rows_before]
|
||||||
first_row_text = first_row_element.text.strip()
|
logger.info(f"Vor Pagination: IDs der Zeilen: {ids_before}")
|
||||||
logger.info(f"Vor Pagination: Erste Zeilen-ID: {first_row_id}, Text: '{first_row_text}'")
|
|
||||||
except NoSuchElementException:
|
except NoSuchElementException:
|
||||||
first_row_id = None
|
ids_before = []
|
||||||
first_row_text = None
|
logger.warning("Vor Pagination: Keine Zeilen gefunden.")
|
||||||
logger.warning("Vor Pagination: Keine Zeilen-ID gefunden.")
|
|
||||||
|
|
||||||
# Extrahiere aktuelle Seite
|
# Extrahiere aktuelle Seite
|
||||||
page_results = self.extract_current_page_results()
|
page_results = self.extract_current_page_results()
|
||||||
@@ -204,23 +215,21 @@ class DealfrontScraper:
|
|||||||
self.driver.execute_script("arguments[0].click();", next_button)
|
self.driver.execute_script("arguments[0].click();", next_button)
|
||||||
logger.info("Klick auf Weiter-Button ausgeführt.")
|
logger.info("Klick auf Weiter-Button ausgeführt.")
|
||||||
|
|
||||||
# Warte auf neue Seite: Änderung der ID ODER Änderung des Texts der ersten Zeile
|
# Warte auf neue Seite: Änderung der IDs der Zeilen
|
||||||
def page_changed(driver):
|
def page_changed(driver):
|
||||||
try:
|
try:
|
||||||
row = driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
|
rows_after = driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
|
||||||
row_id = row.get_attribute("id")
|
ids_after = [r.get_attribute("id") for r in rows_after]
|
||||||
row_text = row.text.strip()
|
logger.debug(f"Nach Pagination: IDs der Zeilen: {ids_after}")
|
||||||
logger.debug(f"Nach Pagination: Erste Zeilen-ID: {row_id}, Text: '{row_text}'")
|
return ids_after != ids_before and len(ids_after) > 0
|
||||||
if first_row_id and row_id != first_row_id:
|
|
||||||
return True
|
|
||||||
if first_row_text and row_text != first_row_text:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
except Exception:
|
except Exception:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self.wait.until(page_changed)
|
self.wait.until(page_changed)
|
||||||
logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID oder neuen Text).")
|
logger.info("Seitenwechsel erfolgreich verifiziert (IDs der Zeilen haben sich geändert).")
|
||||||
|
|
||||||
|
# NEU: Nach jedem Seitenwechsel nach unten scrollen!
|
||||||
|
self.scroll_table_to_bottom()
|
||||||
|
|
||||||
# Logge die aktuelle aktive Seite
|
# Logge die aktuelle aktive Seite
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user