Open wtfloris opened 2 weeks ago
I've mentioned this already on Reddit, but the woonnetrijnmond parser would need a bit of a refactor, as it requires 2 separate requests, whereas hestia at the moment only expects a single one
Since most websites include a map view of all available housing options, the viewer usually downloads a separate file with all POI's. This would hopefully include all required information to parse correctly.
In the case of Woonnet Rijnmond it was, so I quickly made a parser using this method in #59
wooniezie.nl Seems to be part of a larger PaaS platform powered by some hexia.io (developers Zig Websoftware?) where the requests go to. Some of the companies using this platform, which in turn all use the same request API, are the following (but not limited to):
How the website itself looks with the distinct cards on the left, map on the right:
The requests themselves are simple JSON objects. No special data needs to be posted, only the parameters are used. For example with wooniezie limited to 99 sorted by newest:
POST https://wooniezieapi.hexia.io/api/v1/actueel-aanbod?limit=99&sort=-publicationDate
returns:
{"data":[{"ID":140954,"id":140954,"extraInformatieUrl":null,"huurtoeslagMogelijk":null,"postalcode":"5761 CG","street":"Kerksedriessen","houseNumber":"10","houseNumberAddition":"","gemeenteGeoLocatieNaam":"Gemert-Bakel","rentBuy":"Huur","VHE":"2436","energyIndex":null,"zonnepanelen":0,"gaslozeWoning":0,"nulOpDeMeterWoning":0,"availableFromDate":"2024-12-04T00:00:00.000Z","totalRent":590.07,"netRent":553.57,"calculationRent":575.57,"serviceCosts":36.5,"heatingCosts":null,"epv":null,"additionalCosts":null,"eenmaligeKosten":null,"flexibelHurenActief":0,"sellingPrice":null,"latitude":51.5053,"longitude":5.73986,"reactieUrl":"","newlyBuild":0,"areaDwelling":69,"volumeDwelling":null,"areaPerceel":null,"areaLivingRoom":27,"areaSleepingRoom":"13,20 - 5,23","lengte":null,"breedte":null,"hoogte":null,"tuin":0,"storageRoom":0,"actionLabelFrom":null,"actionLabelUntil":null,"balcony":1,"constructionYear":"2001","vatInclusive":1,"aantalMedebewoners":null,"toewijzingModelTypeInCode":"winkelmodel","isZelfstandig":null,"verzameladvertentieID":null,"minimumIncome":null,"maximumIncome":null,"minimumHouseholdSize":1,"maximumHouseholdSize":2,"minimumAge":55,"maximumAge":null,"inwonendeKinderenMinimum":null,"inwonendeKinderenMaximum":null,"leeftijdControleVoorBeideAanvrager":0,"gebruikAangepasteHuurinkomenstabel":0,"voorrangLeeftijdMin":null,"voorrangLeeftijdMax":null,"voorrangHuishoudgrootteMin":null,"voorrangHuishoudgrootteMax":null,"voorrangGezinnenKinderen":0,"voorrangKernbinding":null,"voorrangAlleUrgenties":0,"extraInschrijfduurUitgeschakeld":0,"toewijzingID":96386,"numberOfReactions":18,"toewijzingHeeftAnnuleerReden":0,"isExtraAanbod":0,"reagerenZonderInschrijvingMogelijk":"Nee","huurinkomenstabelGebruiken":1,"modelHuurinkomenstabelActief":1,"modelInZoekprofiel":1,"showEnergyCosts":0,"woningTypeInZoekprofiel":1,"publicationDate":"2024-11-11T16:03:00.000Z","closingDate":"2024-11-14T16:03:00.000Z","toewijzingIsGeannuleerd":0,"isWoningruil":0,"woningruilprofielBijzonderhedenOpWebsiteTonen":null,"regio":null,"land":{"id":524,"name":"Nederland"},"municipality":{"id":36,"name":"Gemert-Bakel"},"city":{"id":52,"name":"Bakel","gemeenteId":36},"neighborhood":{"id":220,"name":"Bakel"},"quarter":{"id":158,"name":"Bakel","plaatsId":52},"corporation":{"id":14,"code":14,"logo":"/portal/uploads/corporation/pictures/Logo_GW_vrij_kleur.png","huurtoeslagTonen":1,"name":"Goed Wonen Gemert","localizedName":"Goed Wonen Gemert"},"dwellingType":{"id":2,"huurprijsDuurActief":0,"categorie":"woning","code":"flat","name":"Appartement met lift","localizedName":"Appartement met lift"},"energyLabel":{"id":2,"icon":"icon_label_b","localizedNaam":"Energielabel B"},"heating":null,"sleepingRoom":{"id":2,"amountOfRooms":2,"localizedName":"2 slaapkamers","naam":"2 slaapkamers"},"kitchen":{"id":1,"localizedName":"Open keuken"},"attic":{"id":4,"localizedName":"Geen zolder"},"oppervlakteTuin":null,"floor":{"id":2,"verdieping":1,"localizedName":"1e verdieping"},"rentDuration":null,"actionLabel":null,"sorteergroep":null,"huurtoeslagVoorwaarde":null,"gardenSite":null,"balconySite":{"id":6,"localizedNaam":"Zuidwest"},"woningsoort":null,"toewijzingModelCategorie":null,"model":{"id":17,"code":"parkerendth","advertentieSluitenNaEersteReactie":0,"einddatumTonen":1,"aantalReactiesTonen":1,"slaagkansTonen":0,"motiverenBijReagerenActief":0,"modelCategorie":null,"isHospiteren":false},"koopvoorwaarden":null,"specifiekeVoorzieningen":[{"id":1,"inCode":"br_rolstoel","dwellingTypeCategory":"woning","localizedLabel":"Rolstoel vriendelijke woning","localizedName":"Rolstoel vriendelijke woning"},{"id":7,"inCode":"br_activiteitenruimte","dwellingTypeCategory":"woning","localizedLabel":"Ontmoetingsruimte","localizedName":"Ontmoetingsruimte"}],"doelgroepen":[{"id":1,"code":"regulier","icon":"br_doelgroep_regulier","localizedNaam":"Reguliere woning"},{"id":4,"code":"55_plus","icon":"icon_doelgroep_senioren","localizedNaam":"Seniorenwoning"}],"servicecomponentenBinnenServicekosten":[],"servicecomponentenBuitenServicekosten":[],"bestemming":null,"toegankelijkheid":[],"eenmaligeKostenSpecificatie":[],"typeContract":null,"floorplans":[{"label":"","uri":"/portal/uploads/dwelling/floorplans/140954-67322773e38e8.pdf"}],"pictures":[{"label":"appartement ","type":"jpg","uri":"/portal/uploads/dwelling/pictures/140954-67322770825b1.jpg"},{"label":"achterzijde gebouw","type":"jpg","uri":"/portal/uploads/dwelling/pictures/140954-673227713772e.jpg"},{"label":"atrium/binnentuin","type":"jpg","uri":"/portal/uploads/dwelling/pictures/140954-67322771df449.jpg"},{"label":"nr. 10","type":"jpg","uri":"/portal/uploads/dwelling/pictures/140954-67322772902f4.jpg"},{"label":"uitzicht vanaf balkon","type":"jpg","uri":"/portal/uploads/dwelling/pictures/140954-6732277340a1d.jpg"}],"energyCosts":[],"videos":[],"urlKey":"140954-kerksedriessen-10-bakel","inschrijvingVereistVoorReageren":true,"isExternModelType":false,"objectType":"object","sorteringBeleidsregels":[],"reactieBeleidsregels":[],"relatieHuurInkomenRegels":[{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":27725},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":37625},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":37625},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":0,"max":37625},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":27726,"max":47699},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":37626,"max":52671},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":37626,"max":52671},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":27726,"max":47699},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":37626,"max":52671},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":1,"leeftijd":{"min":18,"max":0},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":1157.96,"max":9999},"inkomen":{"min":47700,"max":999999},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":18,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":99},"huurprijs":{"min":1157.96,"max":9999},"inkomen":{"min":52672,"max":999999},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":18,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":99},"huurprijs":{"min":879.67,"max":1157.95},"inkomen":{"min":52672,"max":82921},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":18,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":27225},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":36675},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":0,"max":650.43},"inkomen":{"min":0,"max":36675},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":0,"max":36675},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":27226,"max":47699},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":650.44,"max":697.07},"inkomen":{"min":36676,"max":52671},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":3,"max":99},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":36676,"max":52671},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":27226,"max":47699},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":2,"max":2},"huurprijs":{"min":697.08,"max":879.66},"inkomen":{"min":36676,"max":52671},"aowLeeftijdAlsLeeftijdMin":1,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":0,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0},{"corporatieId":14,"plaatsId":null,"huishoudGrootte":{"min":1,"max":1},"huurprijs":{"min":879.67,"max":1157.95},"inkomen":{"min":47700,"max":62191},"aowLeeftijdAlsLeeftijdMin":0,"aowLeeftijdAlsLeeftijdMax":0,"leeftijd":{"min":18,"max":150},"inkomenformVerplicht":0,"inkomenUitzondering":{"min":0,"max":0},"inkomensGroepId":0}],"huurLigtOpOfOnderHuurtoeslaggrens":true,"huurLigtOpOfOnderKwaliteitskortingsgrens":false,"valtInPostcodereeksVoorrang":false,"reactionData":{"loggedin":false,"aangepasteNettoHuurprijs":553.57,"aangepasteTotaleHuurprijs":590.07,"rechtOpHuurprijsverlaging":false,"zoekprofielMatch":false,"isPassend":false,"kanReageren":true,"zoekprofielMatchOrder":0,"toonAlsVoorrangsgroep":false},"woningruilprofiel":{"bijzonderheden":null},"isHaastrijWoning":false,"actionLabelIfActive":false,"actionLabelIsActive":false,"availableFrom":"","infoveld":"<p><strong>Volgorde voorrangsregels</strong><br />1e: inwoners Bakel; 65+<br />2e: inwoners Bakel: 55+ <br />3e: andere belangstellenden 65+<br />4e: andere belangstellenden 55+</p><p><span style=\"color:#FF0000;\"><strong>Heeft u uw persoonlijke gegevens al ge-upload in Wooniezie?</strong></span><br /><strong>Die gegevens zijn nodig om kans te maken op deze woning. Verderop in deze info leest u om welke gegevens het gaat. </strong></p><p><strong>Waarom wil je hier wonen</strong><br />- binnen 5 minuten lopen naar supermarkt, bushalte, alle voorzieningen en winkelstraat<br />- mooie binnentuin, een ontmoetingsplek waar het goed toeven is<br />- uitzicht op het gezondheidscentrum en parkeerplaats<br />- volop parkeergelegenheid aan het complex<br /><br /><strong>Goed om te weten</strong><br />- woning op de 1e verdieping, bereikbaar per lift<br />- (fiets)berging op de begane grond<br />- koken op elektra (zelf kookplaat aanschaffen)</p><p><strong>Ter overname wordt aangeboden</strong><br />- zeil in gehele woning<br />- gordijnen<br />- grote kledingkast, bed en nachtkastje<br />- lampen</p><p><strong>Wat kun je verwachten</strong><br />- de eerste kandidaat met de langste inschrijftermijn, volgens de voorrangsregels, krijgt een aanbieding<br />- ben je kandidaat voor de woning? Dan ontvang je een e-mail van Wooniezie.<br />- geef binnen 24 uur via je persoonlijke pagina op Wooniezie aan dat je interesse hebt.<br />- in de mail, en hieronder, staat wat wij van je nodig hebben voordat je de woning kunt bekijken en accepteren. Lever de documenten op tijd aan om kans te maken.<br />-een intakegesprek is onderdeel van de woningtoewijzing <br /><br /><strong>Benodigde gegevens:</strong></p><ul><li>Kopie geldig legitimatiebewijs van u en uw eventuele partner</li><li>Uittreksel BRP (gemeente) <u>met woonhistorie</u> van u en uw eventuele partner; niet ouder dan 3 maanden. U kunt de volledige woonhistorie ook vinden op mijnoverheid.nl (niet voor huurders van Goed Wonen)</li><li>Meest recente inkomensverklaring of aanslag van de Belastingdienst 2022 of 2023 van u en uw eventuele partner en meeverhuizers (niet zijnde kinderen)</li><li>3 meest actuele loon- of uitkeringsstroken</li><li>Verhuurdersverklaring(en) wanneer u en/of uw eventuele partner en/of meeverhuizers (niet zijnde kinderen) nu of in de afgelopen 3 jaar een zelfstandige woonruimte huurde; niet ouder dan 3 maanden. (niet voor huurders van Goed Wonen)</li><li>Akkoordverklaring en beschikking van bewindvoerder (indien van toepassing)</li></ul><p><strong>Vereist inkomen:</strong><br />Huishoudgrootte Inkomen 2024</p><p>1 pers. < AOW 0 – 27.725,00 </p><p>2 pers. < AOW 0 – 37.625,00 </p><p>1 pers. > AOW 0 – 27.225,00 </p><p>2 pers. > AOW 0 – 36.675,00</p><p> </p>","infoveldKort":null,"infoveldBewoners":null,"actielabelToelichting":"","isGepubliceerd":true}, TRUNCATED],"_metadata":{"page":0,"limit":99,"page_count":1,"total_search_count":29,"total_count":29}}
We can probably reuse the DAK looping system, I'll take a look at it later if I have the time for it
After a dnsdumpster on hexia.io I get around 100 Cloudflare IP's on domains which look like housing corporations. While probably not all 100, it still is quite a lot to poll so much every 5 minutes. Maybe we need to reduce the interval as well to avoid blocking the bot.
woonnet.nl
is just an ad ridden wrapper for huurwoningen.nl
(which we don't have yet). We can especially skip woonnet.nl
since they do not list house numbers ANYWHERE in the property listings.
Then there is huurwoningen.nl
which seems to be a funda.nl
like website. After crosschecking a dozen properties with each other, there seem to be a couple properties listed there which are not on funda.nl
. But then again, am I blind or something or are there no house numbers listed on that website? Seriously why would you not list this Then for the properties which are listed on both websites, funda.nl
does have house numbers.
p.s. woninghuren.nl is already included in the Hexia parser. The given list is complete! 😄
Thanks! Updated the original list.
I missed that woninghuren.nl was included with Hexia indeed, and I agree there seems to be little value in adding huurwoningen.nl. Aggregation sites are always later to list properties than the realtor websites. I added Funda because I wanted to have a bit of a catch-all, but lets not add others (especially if they don't have house numbers).
I have actually seen stuff be listed on huurwoningen.nl before the respective realtor. It's a pretty good aggregator overal and supports a lot more than Hestia (though I agree that supporting the various sites in Hestia directly would be better).
In any case, they don't list house numbers anywhere as far as I can tell, making it unsuitable for our purposes.
Hi,
If you'd like to suggest a website, please leave a comment on this issue.
Currently, the following websites have been suggested (here or elsewhere):
If you're developing a parser for one of these, please leave a comment so others are aware and nobody does double work.
If you did some investigating into one of these and found it unviable to develop a parser, please leave a comment with your results.
Thanks!