Gå til innhold

Prisguide på HW, hvordan?


Anbefalte innlegg

Kunne ikke finne svaret på dette etter flere søk i forumet. Det jeg vil vite er altså hvordan (generelt forklart) prisguiden finner og oppdaterer prisene på produktene. Dvs. tar den ganske enkelt å parser html koden på produkt sidene til de enkelte web butikkene eller er det noe mer avansert?

 

Prøvde nemlig å gjøre dette for en stund tilbake, men fikk bestandig problemet med at web butikkene enten forandret html koden på sidene eller at feilaktig informasjon ble lagt ut. Og da ville selvfølgelig ikke skriptet mitt fungere lengre. (det hendte også at linken til siden jeg hentet fra ble forandret)

 

Tenkte eventuelt at hw.no fikk tilgang til produktdatabaser av noe slag ved å kontakte web butikkene?

 

Opplys meg!

Lenke til kommentar
Videoannonse
Annonse

xml, orker du å utdype det noe mer?

 

Torbjørn,

Selv om perl kanskje er bedre til parsing av html, så baserer det seg jo på akkurat de samme prinsippene. Du får akkurat de samme problemene som jeg nevnte...

 

De som lager web sider for å finne billige charter fly ruter bruker samme prinsippet. Men der skulle jeg tro det i vært fall ville være vanskelig å bare bruke html parsing for å få tak i den informasjonen du vil ha...

Lenke til kommentar
xml, orker du å utdype det noe mer?

 

Torbjørn,

Selv om perl kanskje er bedre til parsing av html, så baserer det seg jo på akkurat de samme prinsippene. Du får akkurat de samme problemene som jeg nevnte...

 

De som lager web sider for å finne billige charter fly ruter bruker samme prinsippet. Men der skulle jeg tro det i vært fall ville være vanskelig å bare bruke html parsing for å få tak i den informasjonen du vil ha...

Det egner seg bedre likevel, det finnes bedre html parsere som lettere kan forholde seg til den logiske strukturen (lettere navigere seg fram til innholdet og finne riktig element der) og vil således være mindre avhengig av ting som endringer i css og andre ting som dukker opp rundt omkring.

 

Det går også fort å skrive om til nye design og.

Lenke til kommentar

Torbjørn: Når du sier at perl er bedre til å lage HTML-parsere, hva nøyaktig tenker du på da? Er det farten du tenker på, eller har perl noen funksjoner som gjør dette lettere? Eller tenker du på allerede-eksisterendes klasser for perl som gjør denne jobben bedre enn de som eksisterer for PHP?

 

Når jeg lager HTML-parsere gjør jeg det vha regulæruttrykk. Da er det vel egentlig samme ulla om jeg velger PHP eller perl. Det eneste som kan ha innvirkning på valget må være farten. Men når det gjelder HTML-parsing er det sjeldent mye å hente på regulæryttrykkene i forhold til å optimalisere hvordan man får tak i innholdet.

 

Når man lager egne regulæruttrykk er det bare fantasien som setter grenser. Jeg har f.eks laget en nyhetsagent som henter ut bilder fra artikler fra diverse aviser. Der bruker jeg et felles regulæruttrykk for alle nettavisene (ca 30 forskjellige). Ved å innføre en rekke regler kan jeg med stor presisjon anta om bildet er relatert til artikkelen eller ikke. Å lage noe slik når man skal hente inn en pris burde være enda enklere.

Lenke til kommentar

Ferdige klasser i perl. Det frarådes å bruke regulæruttyrkk til stort annet enn letteste form for parsing.

 

Med ferdige klasser får man en DOM, som man lett kan navigere seg fram i. F.eks finne en tabell med 3 rader etter 2'de <div> ol. type "spørringer"

 

sannsynligvis hurtigere og.

 

Verd å merke seg at denne typen oppgaver er bakgrunnsoppgaver som man kan bruke hvilket språk man vil for å gjøre, ikke avhengig av webprogrammeringsspråk.

 

Klassene jeg her tenker på er først og fremst:

HTML::TreeBulder

men også HTML::TokeParser

 

Hvis du er mer interessert, så spør i perl-forumet.

 

Du kan ta det for god fisk fra meg eller få det bekreftet fra andre - HTML-parsing gjøres som regel i perl.

Endret av Torbjørn
Lenke til kommentar

Trodde også alle slike html parsere var basert på regulær uttrykk og at man derfor ikke kunne gjøre noe "mer" i et språk enn et annet (så lenge slike regx uttrykk støttes)

Ville tro klassene i perl også ville gjøre det, men at de kanskje gjorde det enklere å utnytte og at folk defor bruker perl til dette. Det er tross alt ingen "magi" som kan hente ut informasjonen for deg, men må basere seg på generelle prinsipper.

 

Det var nettopp det jeg gjorde når jeg prøvde å lage en liten pris guide for å teste. Men web butikkene GJØR forandringer på sidene sine og etter en måned hadde i alle fall halvparten av butikkene gjort forandringer som ødela scriptet mitt. Det værste er jo om de faktisk forandrer linken.

 

En annen ting er at noen web butikker prøver å forhindre deg å gjøre slike tilkoblinger til sidene deres. Aner ikke om det er bevisst eller ikke, men jeg klarte aldri å få til å gjøre dette med komplett.no sine sider. Grunnen er at de har noe slags redirecting før du faktisk kommer til sidene deres, og selv om du kan se på siden de bruker til redirecte så ble jeg ikke så veldig mye klokere. Hvis du prøver standard fopen() og fread i php så fungerer det i vært fall ikke, noen tips om dette?

 

Laaknor påstår jo at de faktisk har en avtale med mpx.no som gjør at de får tilsendt en oppdatering av prisene. Synes dette høres fornuftig ut siden prisguiden nå støtter så mange butikken uten at jeg noensinne har sett "store" feil.

Lenke til kommentar

Man trenger ikke bygge opp en HTML-parser vha regulæruttrykk. Man kan i stedet erstatte det med enklere funksjoner som strpos() osv og på den måten lage en egen "regulæruttrykkmotor" (litt dårlig formulert, men tror dere fatter). Dette kan i mange tilfeller optimalisere scriptet.

 

lamah: Prøv å ikke skriv så spesifikke regulæruttrykk. Ta for deg noen webbutikker og se på strukturen deres. Se hvilke elementer som ligger først i dokumentet og hvilke som kommer til slutt. Slik kan du lage et script som søker etter bestemte elementer som alltid kommer først for varen, og elementer som alltid kommer sist. Da har du innsnevret mengden med data du skal finne prisen i. Deretter får du scriptet ditt til å finne det første tallet som enten har teksten "pris" eller "kr" foran seg, eller "inkl. mva" etter seg.

 

Dette blir selvfølgelig ikke en oppskrift, men gir deg et innblikk hvordan du kan tenke deg fram til et script som kan fungere på flere webbutikker uavhengig om de skal endre designet o.l.

 

Når det gjelder det å hente info kan du bruke curl (noe jeg ikke anbefaler) om du blir redirectet mye, eller du kan prøve å identifisere deg som en IE-bruker ved å sende med de riktige meldingshodene og satse på å unngå masse redirecting. Bruk file_get_contents() (som er raskere enn å lese vha fopen()) sammen med stream_context_create() for å sende de riktige meldingshodene. Da tror jeg du skulle lykkes i å oppnå kontakt til slutt.

 

Torbjørn: Det er sikkert riktig at man som oftest bruker perl til HTML-parsing. Men jeg er sikker på at man kan lage en brukbar HTML-parser-script i PHP også.

Lenke til kommentar

Regulæruttrykk er direkte vanskelig å bruke til en komplett html parser.

 

*) nøstede tags, <b>det<i>te</b> er en <b>salig</i> su<b>pp</b>e</b>

 

*) f.eks kan < og > forekomme som atributter i en tag uten at de er ende eller åpningstags <input value="< huhei>" >

 

*) nøstede fnutter, attribute="att'ri'butt", og attribut='att"ri"butt' vil skape problemer.

 

*) ukorrekt html, manglende close tags må settes inn eller tas hensyn til

 

Man kan vanskelig lage regex for å forholde seg til dette. Hvordan vil du vha regex lage en nøstet minnestruktur ala en DOM? (Document Object Model), hvor tags er sortert i et hierarki? Det er nærmest umulig.

 

Hvis man vil skrive i C f.eks kan man bare se på mozilla source for å få tak i en html parser (gecko heter vel den)

 

RipZ: det er fullt mulig å bruke php, men bruk ikke bruk regex, da har du ladet hagla klar til å skyte deg i foten nesten oppunder kneet. Baser deg på strenger, om nødvendig les htmldokumentet char for char.

 

lamah: å faktisk hente HTML dokumentet vha en HTTP klient er en annen historie. Også her har perl et par meget sterke klient biblioteker som lar deg kopiere en vanlig browser ned til minste lille header. redirects tror jeg ikke er problem i php heller. bruk curl om du har det, http://no2.php.net/curl

Lenke til kommentar

Torbjørn: Eksemplene du drar frem kan alle løses med regulæruttrykk. Det er bare riktig bruk av referanser inni regulæruttrykket som skal til. Men man kan selvfølgelig ikke lage en komplett HTML-parser vha ett regulæruttrykk. Men sammen med en håndfull andre funksjoner kan det nok fint løses. Om det er den optimale løsningen er en annen sak.

 

Men når man kun skal hente prisen fra en side er det ikke nødvendig å bruke en komplett HTML-parser. Et regulæruttrykk laget for formålet burde holde i massevis. Om man er flink og litt oppfinnsom burde det gå an å lage et script basert på regulæruttrykk som henter prisen ut fra en hvilken som helst webbutikk.

Lenke til kommentar
Jeg tviler på at du kan løse alle eksemplene mine med regulæryttrykk?

Det er bare å komme med et problem så skal vi se om jeg skal prøve å komme med et eksempel. Eksemplene blir selvfølgelig meget enkle, men så lenge det beviser at man kan løse det i praksis, så holder det vel i massevis?

Endret av RipZ-
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...