diff --git a/src/adapters/ssr/__init__.py b/src/adapters/ssr/__init__.py index 6f6b717..d748583 100644 --- a/src/adapters/ssr/__init__.py +++ b/src/adapters/ssr/__init__.py @@ -24,6 +24,7 @@ from .realworks import ( fetch_wassenaar, fetch_roepman, fetch_post, + fetch_vankleef, ) from .sure import ( fetch_schielandborsboom, @@ -60,4 +61,5 @@ SCRAPERS = { 'borgdorff': fetch_borgdorff, 'vanherk': fetch_vanherk, 'vanoord': fetch_vanoord, + 'vankleef': fetch_vankleef, } diff --git a/src/adapters/ssr/realworks.py b/src/adapters/ssr/realworks.py index 843d9f8..c2cce3e 100644 --- a/src/adapters/ssr/realworks.py +++ b/src/adapters/ssr/realworks.py @@ -151,6 +151,72 @@ def fetch_morris() -> list[RawListing]: return fetch_realworks("https://www.morrismakelaardij.nl", "morris") +def fetch_vankleef() -> list[RawListing]: + """Fetch Van Kleef makelaars — only Schiedam, as specified.""" + listings_path = f"/aanbod/woningaanbod/schiedam/koop" + listings = [] + page = 1 + + while True: + url = f"https://www.vankleefmakelaars.nl{listings_path}/pagina-{page}/" + soup = fetch_soup(url) + cards = soup.select("li.aanbodEntry") + if not cards: + break + + for card in cards: + try: + a_tag = card.select_one("a.aanbodEntryLink") + if not a_tag: + continue + listing_url = "https://www.vankleefmakelaars.nl" + a_tag["href"] + + adres = _text(card, ".street-address") + postcode = (_text(card, ".postal-code") or "").replace(" ", "") or None + stad = _text(card, ".locality") + prijs = parse_prijs(_text(card, ".koopprijs .kenmerkValue")) + + if prijs and prijs > config.MAX_PRICE: + continue + + status_text = (_text(card, ".objectstatusbanner") or "").lower() + status = _REALWORKS_STATUS_MAP.get(status_text, "beschikbaar") + + img_tag = card.select_one(".hoofdfoto img") + hero = img_tag["src"] if img_tag else None + + kk = _realworks_detail(listing_url, "vankleef") + + listings.append(RawListing( + url=listing_url, + source_makelaar="vankleef", + adres=adres, + postcode=postcode, + stad=stad, + prijs=prijs, + status=status, + hero_image_url=hero, + woningtype=kk.get("woningtype"), + bouwjaar=int(kk["bouwjaar"]) if kk.get("bouwjaar") else None, + woonoppervlak=parse_m2(kk.get("woonoppervlak")), + perceeloppervlak=parse_m2(kk.get("perceeloppervlak")), + kamers=int(kk["kamers"]) if kk.get("kamers") else None, + slaapkamers=int(kk["slaapkamers"]) if kk.get("slaapkamers") else None, + energielabel=kk.get("energielabel"), + )) + if config.APP_ENV == "dev": + break + except Exception as e: + log.warning("vankleef: parse fout: %s", e) + + if len(cards) < 10: + break + page += 1 + + log.info("vankleef: %d listings opgehaald", len(listings)) + return listings + + # --------------------------------------------------------------------------- # Makelaardij Wassenaar (Schiedam) — Realworks CMS, JSON-LD listing page # ---------------------------------------------------------------------------