[PHP] Google SERP uitlezen met behulp van Xpath

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 09-09 20:37
Hoi, :)

Vanwege een onderzoekje met betrekking tot zoekmachines wil ik de resultaten van zoekmachines op een andere manier weergeven. Hiervoor ben ik dus bezig met een kleine class die een resultaat van (in dit geval Google) ophaalt, en deze anders gaat weergeven.

Hiervoor heb ik niet alle gegevens nodig, maar in principe alleen (even van het voorbeeld "bier" uitgaande):

titel + de url
omschrijving
en de in groen weergegeven link

echter als je kijkt bij google bij het voorbeeld bier zie je dat er heel veel rotzooi door google er bij wordt geplaatst:
Bier - Wikipedia
Bier is een alcoholische drank gemaakt uit granen, waaronder gerst en tarwe. Soms wordt nog fruit toegevoegd (bijvoorbeeld kersen (krieken) in krieklambiek) ...
Productieproces - Geschiedenis - Biersoorten - Bierculturen
nl.wikipedia.org/wiki/Bier - In cache - Vergelijkbaar
Nu heb ik het al voor elkaar om de titel en de url te krijgen, echter de overige informatie wordt door google in een 1 div gegooid:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="s">
<em>Bier</em>
is een alcoholische drank gemaakt uit granen, waaronder gerst en tarwe. Soms wordt nog fruit toegevoegd (bijvoorbeeld kersen (krieken) in krieklambiek)
<b>...</b>
<br/>
<div class="osl">
<a href="/url?q=http://nl.wikipedia.org/wiki/Bier%23Productieproces&ei=t8IHS6uZDJLv-QbNvuHFDQ&sa=X&oi=oneline_sitelinks&resnum=6&ct=result&cd=1&ved=0CBcQ0gIoAA&usg=AFQjCNH30Lp-7kTiqkKP1D09JD-RTA5t1A">Productieproces</a>
-
<a href="/url?q=http://nl.wikipedia.org/wiki/Bier%23Geschiedenis&ei=t8IHS6uZDJLv-QbNvuHFDQ&sa=X&oi=oneline_sitelinks&resnum=6&ct=result&cd=2&ved=0CBgQ0gIoAQ&usg=AFQjCNGItmajNwrdseTkB0Ftbk7rw94LJA">Geschiedenis</a>
-
<a href="/url?q=http://nl.wikipedia.org/wiki/Bier%23Biersoorten&ei=t8IHS6uZDJLv-QbNvuHFDQ&sa=X&oi=oneline_sitelinks&resnum=6&ct=result&cd=3&ved=0CBkQ0gIoAg&usg=AFQjCNEbvC96cZ-yD_CtJPAINZzpCuQKgQ">Biersoorten</a>
-
<a href="/url?q=http://nl.wikipedia.org/wiki/Bier%23Bierculturen&ei=t8IHS6uZDJLv-QbNvuHFDQ&sa=X&oi=oneline_sitelinks&resnum=6&ct=result&cd=4&ved=0CBoQ0gIoAw&usg=AFQjCNGMZO7BAZM1y-1HKQU4rUZ39UlUGQ">Bierculturen</a>
</div>
<cite>
nl.wikipedia.org/wiki/
<b>Bier</b>
-
</cite>
<span class="gl">
<a onmousedown="return clk(this.href,'','','clnk','6','')" href="http://74.125.77.132/search?q=cache:2xlNCyKcQ2kJ:nl.wikipedia.org/wiki/Bier+bier&cd=6&hl=nl&ct=clnk&gl=nl">In cache</a>
-
<a href="/search?hl=nl&q=related:nl.wikipedia.org/wiki/Bier&sa=X&ei=t8IHS6uZDJLv-QbNvuHFDQ&ved=0CBYQHzAF">Vergelijkbaar</a>
</span>
</div>


en ik krijg alleen de inhoud van de div terug en niet de structuur
bier.startpagina.nlbier.startpagina.nl: de pagina met de beste links over bier, brouwerijen en nog veel meer!bier.startpagina.nl/ - In cache - Vergelijkbaar
nl.wikipedia.org/wiki/Bier -
Hoe kan ik (bij voorkeur met xpath oid) nou die informatie ook opgedeeld terugkrijgen, zodat ik makkelijk de door mij benodigde informatie kan opvragen?


Hier mijn class tot nu toe:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php

class zoektest #verplicht opgeven ($url)
{

    public function __construct($zoekopdracht) {
    
    }
    
    protected function getDOM($url) { 
        #Deze functie haalt de DOM van een pagina op
        $this->html = file_get_contents($url); 
        $this->dom = new DomDocument(); 
        @$this->dom->loadHTML($this->html); 
        $this->xpath = new DomXpath($this->dom); 
    }       

}

class google_zoektest extends zoektest //verplicht opgeven ($url)
{
    public function __construct($zoekopdracht)
    {
        /*Deze functie set de URL van het google*/
        $url = "http://www.google.nl/search?q=bier&num=8&hl=nl&start=0"; 
        $this->getDOM($url);
    }   
   
    public function getSerp() {

        $this->ol = $this->dom->getElementsByTagName('ol');
        
        $teller = 0;
        foreach ($this->ol as $tag)
        {
            if($teller > 0) {        
                $this->li = $tag->getElementsByTagName('li');
                
                foreach ($this->li as $tag2)
                {
    
                        $this->href = $tag2->getElementsByTagName('a');
                        
                        $teller1 = 0;
                        foreach ($this->href as $tag3)
                        {
                            if($teller1 == 0) {
                                echo "<br /><br /><a href=".$tag3->getAttribute('href').">".$this->href->item(0)->nodeValue."</a>";
                                #echo $tag3->getAttribute('href')."<br /><br />";                       
    
                                echo "<br />".$this->li->item(2)->nodeValue;
    
                                $this->cite = $tag2->getElementsByTagName('cite');
                                foreach ($this->cite as $tag4) {
                                   echo "<br />".$this->cite->item(0)->nodeValue;
                                }
                            }
                            $teller1++;
                        }
                }
            }
            $teller++;
        }
    }   
}


            $google = new google_zoektest("bier");
            $google->serp = $google->getSerp();
    
            echo $google->serp;
?>



bvd :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:53
Kun je niet beter de Google AJAX Search API gebruiken om gestructureerde resultaten op te vragen?

Acties:
  • 0 Henk 'm!

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 09-09 20:37
Soultaker schreef op zaterdag 21 november 2009 @ 12:06:
Kun je niet beter de Google AJAX Search API gebruiken om gestructureerde resultaten op te vragen?
Was inderdaad een goede optie geweest, in dit geval wil ik de test echter niet op javascript laten leunen, vandaar dat dit in dit geval niet gaat werken voor me.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
LocoShady schreef op zaterdag 21 november 2009 @ 12:08:
[...]
Was inderdaad een goede optie geweest, in dit geval wil ik de test echter niet op javascript laten leunen, vandaar dat dit in dit geval niet gaat werken voor me.
Als het enkel om een tijdelijk onderzoekje gaat zou je kunnen overwegen om FF + Firebug te installeren, wat requests te doen met javascript en dan gewoon de REST-urls nabouwen in curl oid.

Qua toekomstvastheid zou ik het niet aanraden ( ze kunnen de javascript lib omgooien waardoor jouw aanroepen niet meer werken ) maar voor een tijdelijk iets zou je de gok kunnen wagen

Acties:
  • 0 Henk 'm!

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 09-09 20:37
Gomez12 schreef op zaterdag 21 november 2009 @ 12:32:
[...]

Als het enkel om een tijdelijk onderzoekje gaat zou je kunnen overwegen om FF + Firebug te installeren, wat requests te doen met javascript en dan gewoon de REST-urls nabouwen in curl oid.

Qua toekomstvastheid zou ik het niet aanraden ( ze kunnen de javascript lib omgooien waardoor jouw aanroepen niet meer werken ) maar voor een tijdelijk iets zou je de gok kunnen wagen
Nee het is wel een onderzoek wat wat langer gaat lopen, en ivm updates wil ik me daar niet aan wagen.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:53
Er is ook een REST API voor Google die absoluut niet gebonden is aan JavaScript of een browser. Dat staat nota bene op de pagina die ik al linkte! Een heel klein beetje verder kijken dan je neus lang is mag wel hoor.

Verder: als je per se de HTML code wil parsen, dan moet je beginnen met in kaart te brengen welke structuur de resultatenpagina heeft en welke informatie je er uit wil halen. Begin daar eerst eens mee, dan kun je daarna bedenken hoe je die informatie met XPath eruit kunt halen.

Acties:
  • 0 Henk 'm!

  • Reddol
  • Registratie: September 2008
  • Laatst online: 19:26
REST API is een zeer goede oplossing.
Zoiets gebruik ik ook met google maps en werkt perfect!
Het enige nadeel is dat je hosting soms geen CURL ondersteund. Gewoon even testen of navragen.

Als je het niet kan, laat het dan!


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:53
(Hoeft ook niet per se met cURL, kan net zo goed met PHP's fopen-wrappers, of 'n directe socketverbinding, of een pipe naar fetch/wget, of op een andere manier. Maar inderdaad, als je host je op geen enkele manier naar een externe server laat verbinden heb je een probleem.)
Pagina: 1