erweitertes Log. Seitenzugriff klappt jetzt
This commit is contained in:
@@ -16,9 +16,23 @@ from config import Config, DEALFRONT_LOGIN_URL, DEALFRONT_CREDENTIALS_FILE, DEAL
|
||||
# Logging-Konfiguration
|
||||
LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO
|
||||
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)
|
||||
|
||||
# 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__)
|
||||
|
||||
# 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"
|
||||
|
||||
class DealfrontScraper:
|
||||
@@ -209,42 +223,40 @@ class DealfrontScraper:
|
||||
def extract_current_page_results(self):
|
||||
"""
|
||||
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:
|
||||
logger.info("Extrahiere Ergebnisse von der aktuellen Seite...")
|
||||
results = []
|
||||
|
||||
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody > tr[id]")
|
||||
self.wait.until(EC.presence_of_element_located(rows_selector))
|
||||
time.sleep(3)
|
||||
# Warten, bis die Tabelle (bzw. ihr Body) da ist
|
||||
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody")))
|
||||
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)
|
||||
|
||||
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()
|
||||
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):
|
||||
company_name, website = "", ""
|
||||
for i, row in enumerate(rows, 1):
|
||||
try:
|
||||
# --- IHR SELEKTOR FÜR FIRMENNAMEN ---
|
||||
company_name_element = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text")
|
||||
company_name = company_name_element.get_attribute("title").strip()
|
||||
|
||||
# --- 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})
|
||||
# Wir verwenden die stabilen Selektoren, die Sie identifiziert haben.
|
||||
company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").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})
|
||||
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
|
||||
|
||||
logger.info(f"{len(results)} Firmen erfolgreich extrahiert.")
|
||||
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
|
||||
return results
|
||||
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user