[PHP] Interface voor flexibele spider

Pagina: 1
Acties:

Onderwerpen


  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Ik ben bezig met het maken van een flexibele spider voor het uitlezen van huizen websites. De bedoeling is dat er een interface komt waarbij de target page geladen wordt en de diverse elementen (oppervlakte/prijs) geselecteerd kunnen worden door middel van een Firebug-a-like selector. De spider zal vervolgens deze site crawlen om zo alle huizen/kamers uit te lezen en op te slaan. Het doel is een flexibele spider te maken waarbij er dus makkelijk meerdere sites toegevoegd kunnen worden, niet makkelijk :)

Op dit moment ben ik zover:
Ik heb een Firebug look-a-like selector gemaakt die clicks registreert op elementen. Wordt er een element geselecteerd dan wordt de index van dit element uitgelezen. Bijvoorbeeld: als we weten dat de prijs zich in het 71e li element bevindt kunnen we het later makkelijk terug vinden. Ook andere pagina's van dezelfde site kunnen zo uitgelezen worden door steeds dit 71e li element te pakken.

Mijn vraag aan jullie is. Is dit de beste manier om dit probleem aan te pakken ( het terug halen van elementen op basis van hun index ). Op dit moment laadt de target page in een iframe waardoor ik met een omweg click events kan uitlezen van de firebug selector. Wat zijn jullie gedachtes.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Niet flexibel genoeg voor een flexibele spider :)

Maar algemeen gezegd : Je benadert het probleem verkeerd om, geen enkele webdesigner gaat li'tjes tellen / toevoegen zodat gegeven x altijd op plaats 71 staat. Soms staan er minder gegevens en dan wordt het li 70, soms staan er meer gegevens en dan wordt het li 72. Nobody gives a shit wat er op het 71e li'tje staat.
Ze gooien een reclame campagne erdoorheen in de zomer en oeps, dat zijn weer wat extra li'tjes.

Oftewel je wilt helemaal niets met de totale pagina te maken, je wilt beginnen bij het element wat je wilt hebben en dan omhoog bubbelen in de dom-tree tot je bij een uniek punt bent aangekomen (liefst een uniek id/unieke selector).
Op die manier kan er van alles op die pagina gebeuren (in theorie zelfs een complete redesign) zolang jouw unieke punt erin blijft staan en je bubble niet qua vorm veranderd blijft jouw spider werken.
En last but not least, je wilt zo goed als nooit gaan tellen, dat is echt een last-resort zo foutgevoelig is dat.

Voor bijv een funda daar schat ik dat je wilt dat je spider (even alleen de prijs genomen) prop-hdr/*/price-wrapper/price/text() ophaalt. Ipv span[xxx]

En last but not least, geef je gebruiker aanpassingsmogelijkheden / keuze. Als iemand toevallig de spider richt op een fund-pagina geen alternatieven / gerelateerde artikelen dan lijkt de class price wel interessant, maar die is niet op elke pagina uniek :)

Wil je een echt goede specifieke automatische spider bouwen dan je eigenlijk eerst een groot aantal pagina's ophalen zodat je een grote sample-size hebt om op te checken. Op 1 pagina is het heel moeilijk om een universeel iets voor de hele site te vinden.

[ Voor 8% gewijzigd door Gomez12 op 16-03-2012 22:13 ]


  • MikeN
  • Registratie: April 2001
  • Laatst online: 02-11 21:31
Beautiful Soup staat redelijk bekend als een hele goede screen scrape tool, misschien geeft het je wat inspiratie: http://www.crummy.com/software/BeautifulSoup/

  • NS_5
  • Registratie: Februari 2005
  • Laatst online: 18-12-2024
Ik denk dat je hier eens naar moet kijken: http://simplehtmldom.sourceforge.net/.

  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Het probleem is dat het ophalen van de parents geen unieke combinatie geeft voor het opnieuw ophalen van de element. Vandaar dat ik terugval op de positie van de elementen.

Dit is mijn huidige plan:
Stel we willen de oppervlakte weten.
We zoeken naar <td>oppervlakte:</td> dat index 73 heeft en we weten dat de waarde 1 index verder staat. Vervolgens haal ik de waarde van td met index 74 op en kan heb ik de waarde.

Natuurlijk komt het voor dat <td>oppervlakte:</td> niet op 73 maar bijv. op 76 staat. De waarde staat nog steeds 1 index verder ( index 77 dus ). Het probleem is echter herkennen dat de TD niet meer 73 maar 76 is geworden.

Ik heb SimpleHTMLDom geprobeerd maar kwam hiermee niet tot een passende oplossing, suggesties?

Edit:
Is het mogelijk te zoeken naar <td>oppervlakte:</td> op een andere pagina en er dan achter te komen welke index deze heeft?

[ Voor 8% gewijzigd door Dimby op 16-03-2012 23:35 ]


  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 16:51
Doen wat Gomez zegt. Bij jaap.nl staat de prijs bijv in een span met id details_price. Dat zal minder snel veranderen dan dat ze besluiten een extra elementje toe te voegen voor een banner of weet ik veel wat. Hopen dat het op plek 73 staat is veel te onzeker.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Dimby schreef op vrijdag 16 maart 2012 @ 22:41:
Het probleem is dat het ophalen van de parents geen unieke combinatie geeft voor het opnieuw ophalen van de element. Vandaar dat ik terugval op de positie van de elementen.
Lijkt me extreem sterk in iets anders als een web 1.0 site (en daar gaat tellen je ook niet helpen)
Dit is mijn huidige plan:
Stel we willen de oppervlakte weten.
We zoeken naar <td>oppervlakte:</td> dat index 73 heeft en we weten dat de waarde 1 index verder staat. Vervolgens haal ik de waarde van td met index 74 op en kan heb ik de waarde.

Natuurlijk komt het voor dat <td>oppervlakte:</td> niet op 73 maar bijv. op 76 staat. De waarde staat nog steeds 1 index verder ( index 77 dus ). Het probleem is echter herkennen dat de TD niet meer 73 maar 76 is geworden.
Wat is daar het probleem aan? Je kan best een uniek punt (binnen een table dan dat wel) als 1 td na de td met oppervlakte: je waarde staat.
Je moet simpelweg niet zoeken naar element 73, maar eerst naar een table met class / id x en daarbinnen naar een cell met als content : oppervlakte:
Edit:
Is het mogelijk te zoeken naar <td>oppervlakte:</td> op een andere pagina en er dan achter te komen welke index deze heeft?
Tuurlijk, simpelweg een for-loopje over al je td's donderen. Degene die matcht die matched dat is je index. Enkel is het op een complete pagina redelijk foutgevoelig (wat als er gerelateerde huizen etc bijkomen met ook een oppervlakte genoemd) daarom beperk je eerst het zoekgebied tot die betreffende tabel en ga je niet over alle td's kijken.

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Goutte heeft volgens mij alles dat jij zoekt, tenzij ik er helemaal naast zit :-)
https://github.com/fabpot/Goutte

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1