Twaalf scrapers en één vraag: waar kan ik deze maand speeddaten?

Wie in Nederland wil speeddaten, klikt zich door een handvol sites. Speeddaten.nl, Flitsdate, Aboutlove, Dating Oost, Tortelen: elk heeft een eigen agenda, eigen leeftijdsgroepen en een eigen manier om te laten zien of er nog plek is. Een overzicht van alles in jouw stad bestond niet. Dus heb ik het gebouwd: DateRadar.
DateRadar is een Laravel-app met Livewire. Elke nacht draaien twaalf scrapers, één per aanbieder. Op het moment van schrijven staan er 520 komende events in 41 steden op de site. Het scrapen zelf viel mee. Hieronder de vijf problemen waar ik meer tijd in stak.
Een halve scraper is gevaarlijker dan een kapotte
Als een scraper een exception gooit, weet je dat er iets mis is. Lastiger is een scraper die gewoon doorloopt nadat de aanbieder zijn HTML heeft aangepast, en ineens 4 events vindt in plaats van 60. Een naïeve sync doet dan precies wat hij moet doen: alles wat hij niet meer ziet van de site halen. 56 events weg, zonder één foutmelding.
Daarom heeft elke scrape run nu een uitkomst: OK, Failed of Dropped. Dropped betekent dat de scraper minder dan de helft vond van wat er online stond. Dan haalt hij niets weg en krijg ik 's ochtends een mail met per aanbieder de aantallen en de foutmelding. Bij aanbieders met minder dan vijf events sla ik die check over, want daar lijken een paar afgelaste avonden al op een instorting.
private function hasDropped(int $found, int $online): bool
{
if ($online < $this->minimumOnlineEventsToDetectDrop) {
return false;
}
return $found * 100 < $online * (100 - $this->dropPercentage);
}Dezelfde stad heet overal anders
De ene aanbieder schrijft "Den Bosch", de andere "'s-Hertogenbosch". Een derde zette "Amsterdam Hogeropgeleiden" in het veld voor de plaats, en weer een ander "Zeeland/Goes". Zolang de stad een string op het event was, kreeg elke variant een eigen pagina.
De stad is nu een eigen model met één vaste naam, de naam waarop mensen zoeken. Varianten wijzen naar dezelfde stad. Dat klinkt als een kleine refactor, maar het raakte elke query, de sitemap en elke stadspagina zoals speeddaten in Utrecht.
Wat is eigenlijk een speeddate?
Sinds kort toont DateRadar ook singlesfeesten en -borrels. Dan moet je per event bepalen wat het is. Ik herken het aan woorden in de titel: "speeddat", "slowdat" en "speldat" maken er een speeddate van, "feest" of "party" een singlesfeest, "borrel" of "quiz" een borrel.
Lang niet elke titel bevat zo'n woord. Daarom heeft elke aanbieder een standaardsoort voor de rest. Bij Mingle the Single is dat een borrel: hun Mystery Match is een avond aan tafels die matchmakers samenstellen, zonder de vaste rondes van een speeddate. Dat haal je niet uit de HTML; dat moet je zelf lezen en beslissen.
Bots klikken ook
Om aanbieders te laten zien wat DateRadar oplevert, tel ik doorklikken: iemand die via de site naar de inschrijfpagina gaat. In september telde mijn database 8.795 klikken. Google Analytics zag er rond de 170.
De doorklikroute stond open voor crawlers: geen nofollow, niet geblokkeerd in robots.txt. Elke bot die de site afliep, "klikte" op elk event. Nu telt alleen een bezoeker met een sessie, één keer per event per dag, en elke doorklik krijgt utm_source=dateradar mee. Zo ziet een aanbieder in zijn eigen Analytics wat er via DateRadar binnenkomt. Dat getal moet kloppen, want daarmee ga ik straks met aanbieders om tafel.
Pas vanaf drie events een pagina
In het begin kreeg elke plaats met een event een eigen pagina in de sitemap, ook dorpen met één avond per jaar. Google zag dan tientallen bijna lege pagina's die op elkaar leken. Nu wordt een stadspagina pas aan zoekmachines aangeboden bij minstens drie komende events.
Wat ik ervan geleerd heb
De scrapers schrijven kostte de minste tijd. De meeste tijd ging zitten in bepalen wat de data betekent: welke stad dit is, wat voor avond dit is en of deze klik van een mens kwam.
Op dateradar.nl zie je per stad en leeftijd welke avonden er zijn en of er nog plek is. Rond 11 november staat alles voor Singles Day op één pagina.
Wil je iets vergelijkbaars bouwen, data van tientallen sites betrouwbaar bij elkaar brengen? Neem gerust contact op.
