I det her indlæg skal det handle om noget lidt andet end prestashop, jeg har nemlig i den senere tid pillet med en masse andre ting bla. har jeg lavet en side der hjælper forældre med at finde en god og billige babyalarm og faktisk også en side der gør det sammen med en robotstøvsuger, siderne er bygget op som en guide til den bedste pris på de forskellige modeller. Inden jeg overhovedet var gået i gang med projektet så kunne jeg godt se at det ville blive et stort projekt at holde priserne opdateret.
Den eneste udvej var derfor at bygge en pris crawler, heldigvis har jeg tidligere arbejdet lidt med at crawler sider. Fx. har jeg sat et PHP script op der automatisk henter Trustpilots anmeldelser til dressme.dk (Som selvfølgelig betaler for at bruge Trustpilot anmeldelserne). Sagen her var dog nogen ganske anderledes fordi det ikke bare var en side jeg skulle hente noget fra, men rigtig mange sider og da HTML’en på siderne er forskellige var der brug for noget dynamisk.
Efter en del research og en snak med Casper Schneidereit kom jeg på sporet af noget brugt. Han fortalte ganske kort at han havde bygget noget lignende hvor han brugte curl og regulære udtryk. Jeg indrømmer gerne at regulære udtryk ikke er min stærke side, og at det nok er der jeg bruger mest tid når jeg skal indsætte nye sider som der skal hentes priser fra.
Når men nok snak, nu til en konkret eksempel, for det er jeg overbevist om at i sætter mest pris på. Jeg har valgt at tag noget fra min egen side, så bliver jeg ikke skældt ud for at belaste andres servere. Lad os antag at jeg gerne vil fiske prisen fra mit webpack 2 modul. Den ser sådan her ud i browseren:
Prisen som vi gerne vil fiske er markeret med grøn, men læg mærke til at der er andre priser rundt om, så det er altså ikke muligt bare at lave en søgning på “TAL TAL TAL TAL, TAL TAL DKK” selvfølgelig skrevet om til et regulært udtryk, det vil nemlig give 3 resultater, istedet for skal vi ind og analysere siden lidt og det gør jeg ved at gemme html’en fra siden i en .txt fil det ser sådan her ud i koden:
//starter curl
$ch = curl_init();
//besøger den valgt URL
curl_setopt($ch, CURLOPT_URL, "https://www.prestatips.dk/shop/da/prestashop-moduler/10-webpack-2.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//gemmer html i variablen $data $data = curl_exec($ch);
//Lukker forbindelsen igen for at spare hukommelse på serveren curl_close($ch);
//gemmer indholdet i test.txt
$file = 'test.txt';
$current = $data;
file_put_contents($file, $current);
Når jeg har åbnet min fil med indholdet ovenover i en browser, så åbner jeg test.txt og finder prisen, det gør jeg ret simpelt ved at søge efter den, ellers kan der nemlig godt være en del kode at kigge igennem. Det ser sådan her ud:
Det vi skal lave et regulært udtrykt til at finde er altså: “<span id=”our_price_display”>999,00 DKK</span>” Det meste af det er statisk, men prisen er jo dynamisk, og det er den vi gerne vil finde. Samtidigt skal vi bruge et regulært udtryk der alene matcher prisen for at pille den ud af html’en, det ser ud som nedenfor:
//Regulært udtryk der matcher prisen og omlæggende html
$pris_reg = '/[0-9]{1,9}[0-9,]{1,3} DKK<\/span>/i';
//regulært udtryk der matcher prisen
$pris_format_regex = '/[0-9]{1,9}[0-9,]{1,3} DKK/i';
//Leder efter prisen og omlæggende html i koden.
preg_match_all($pris_reg, $current, $result, PREG_PATTERN_ORDER);
//Gemmener resultat i $result
$result = $result[0];
//Finder Prisen og valuta
preg_match_all($pris_format_regex, $result[0], $price_result, PREG_PATTERN_ORDER);
//Gemmener resultat i $result
$price_result = $price_result[0];
//Laver et foreach loop der fjerner valuta og retter evt. komma og punktum til noget om php kan bruge som et tal
foreach ($price_result as $price){
$price = preg_replace('/dkk/i', '', $price);
$price = preg_replace('/kr/i', '', $price);
$price = preg_replace('/\./i', '', $price);
$price = preg_replace('/\,/i', '.', $price);
}
//Skriver resultatet til skærmen, her skal man jo så gemme det i databasen eller hvordan man nu ønsker at håndtere det.
echo $price;
Jeg har gemt alle mine regulære udtryk i en database sammen med de tilhørende URL’s, så looper jeg mig igennem dem for at hente de nyeste priser. Det gør jeg 1 gang om dagen med 1 cron job. Jeg har så sat det sådan op at hvis den ikke får fisket prisen så bliver der sendt en mail til mig, og gemt en .txt filen med html’en fra den side hvor jeg ikke fik prisen, så kan jeg gå ind og se hvad der er gået galt.
Gode relevante links:
Lær og test regulære udtryk
Lidt indviklet men god side om regulære udtryk
Siden med prissammenligning på babyalarmer
EDIT: Efter at have bygget det hele selv, så faldt jeg over et plugin til wordpress som klare alt det svære for en, det ville jeg jo godt have stødt på lidt før, for så havde jeg helt sikkert sparet en masse timer, du finder affiliateplugin her. Hvis du er nysgerrig for hvad det kan, og gerne vil se det inden du køber så ved jeg at denne her side som SSD harddiske er bygget med det plugin.
Spændende indsigt i hvordan en crawler skrives og bestemt noget der kan bruges når/hvis der skal arbejdes med prissamenligning eller blot præsentation af varer på en affilliate side…
Det har faktisk også været ret spændende at lave det, og bestemt og lærerigt, jeg plejer at tænke i helt andre baner.