dealfront_enrichment.py aktualisiert
This commit is contained in:
@@ -132,26 +132,32 @@ class DealfrontScraper:
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
def scrape_all_pages(self, max_pages=10):
|
def scrape_all_pages(self, max_pages=10):
|
||||||
|
"""
|
||||||
|
Iteriert durch alle Ergebnisseiten, indem auf den 'Weiter'-Button geklickt wird.
|
||||||
|
Verwendet einen präzisen XPath für den Paginierungs-Button.
|
||||||
|
"""
|
||||||
all_companies = {}
|
all_companies = {}
|
||||||
|
|
||||||
for page_number in range(1, max_pages + 1):
|
for page_number in range(1, max_pages + 1):
|
||||||
logger.info(f"--- Verarbeite Seite {page_number} ---")
|
logger.info(f"--- Verarbeite Seite {page_number} ---")
|
||||||
|
|
||||||
# Warten, bis die Tabelle sichtbar ist
|
# Warten, bis die Tabelle sichtbar ist
|
||||||
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table")))
|
table_selector = (By.CSS_SELECTOR, "table#t-result-table")
|
||||||
|
self.wait.until(EC.visibility_of_element_located(table_selector))
|
||||||
|
time.sleep(2) # Kurze Pause für das JS-Rendering
|
||||||
|
|
||||||
try:
|
try:
|
||||||
first_row_id_element = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")))
|
first_row_element = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")))
|
||||||
first_row_id = first_row_id_element.get_attribute("id")
|
first_row_id = first_row_element.get_attribute("id")
|
||||||
|
logger.debug(f"Erste Zeile auf Seite {page_number} hat die ID: {first_row_id}")
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
logger.warning("Konnte keine Datenzeilen auf der Seite finden. Beende Paginierung.")
|
logger.warning("Konnte keine Datenzeilen mehr finden. Beende Paginierung.")
|
||||||
break
|
break
|
||||||
|
|
||||||
page_results = self.extract_current_page_results()
|
page_results = self.extract_current_page_results()
|
||||||
if not page_results and page_number > 1:
|
if not page_results:
|
||||||
logger.info("Keine weiteren Ergebnisse auf dieser Seite extrahiert. Paginierung abgeschlossen.")
|
|
||||||
break
|
break
|
||||||
|
|
||||||
for company in page_results:
|
for company in page_results:
|
||||||
unique_key = (company.get('name'), company.get('website'))
|
unique_key = (company.get('name'), company.get('website'))
|
||||||
if unique_key not in all_companies:
|
if unique_key not in all_companies:
|
||||||
@@ -159,16 +165,31 @@ class DealfrontScraper:
|
|||||||
|
|
||||||
logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}")
|
logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}")
|
||||||
|
|
||||||
|
# --- Detailliertes Paginierungs-Debugging mit dem korrekten Selektor ---
|
||||||
try:
|
try:
|
||||||
# Robuster Selektor für den "Weiter"-Button
|
# Dieser XPath sucht nach einem <a>-Tag mit der Klasse 'eb-pagination-button',
|
||||||
next_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//a[not(contains(@class, 'disabled')) and .//svg[contains(@class, 'fa-angle-right')]]")))
|
# das NICHT die Klasse 'disabled' hat und ein SVG-Element enthält,
|
||||||
|
# dessen <path>-Daten mit "M8.293 5.293" beginnen (der Pfeil nach rechts).
|
||||||
|
next_button_xpath = (
|
||||||
|
"//a[contains(@class, 'eb-pagination-button') and not(contains(@class, 'disabled'))]"
|
||||||
|
"//svg[.//path[starts-with(@d, 'M8.293')]]"
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.debug(f"Versuche, den 'Weiter'-Button mit XPath zu finden: {next_button_xpath}")
|
||||||
|
next_button = self.driver.find_element(By.XPATH, next_button_xpath)
|
||||||
|
|
||||||
|
logger.info("Klickbarer 'Weiter'-Button gefunden. Klicke darauf.")
|
||||||
self.driver.execute_script("arguments[0].click();", next_button)
|
self.driver.execute_script("arguments[0].click();", next_button)
|
||||||
|
|
||||||
# Warten, bis die alte erste Zeile verschwunden ist
|
# Warten, bis die alte erste Zeile verschwunden ist
|
||||||
self.wait.until(EC.staleness_of(self.driver.find_element(By.ID, first_row_id)))
|
logger.debug(f"Warte auf das Verschwinden der alten Zeile (ID: {first_row_id})...")
|
||||||
logger.info("Neue Seite geladen.")
|
old_first_row = self.driver.find_element(By.ID, first_row_id)
|
||||||
except TimeoutException:
|
self.wait.until(EC.staleness_of(old_first_row))
|
||||||
|
logger.info("Seitenwechsel erfolgreich verifiziert!")
|
||||||
|
|
||||||
|
except (NoSuchElementException, TimeoutException):
|
||||||
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
|
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
|
||||||
|
self._save_debug_artifacts(f"pagination_end_p{page_number}")
|
||||||
break
|
break
|
||||||
|
|
||||||
return list(all_companies.values())
|
return list(all_companies.values())
|
||||||
|
|||||||
Reference in New Issue
Block a user