Data verzamelen zonder API

Pagina: 1
Acties:
  • 2.741 views

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Modbreak:Afgesplitst van De Devschuur Coffee Corner - Iteratie 4


Op aanraden van een Admin hier geplaatst

Hey jongens,

Ik ben een tijdje aan het kijken wat de beste manier is om voetbaluitslagen van de Eredivisie en straks het WK op te halen. Ben al een tijd op zoek geweest naar services die XML data leveren van de Eredivisie en/of het WK. Deze services zijn er, niet zo veel, en geven tevens niet de output die ik zoek, en zijn tevens betaald (In zoverre dat het te veel geld is voor een localhost project wat nooit echt het levenslicht zal zien).

Nu heb ik 2 opties:
1. Service vinden die wél data geeft (Uitslagen), die netjes opslaan in een database, en dmv een cronjob elk uur updaten.
2. Data gaan 'minen' van een derde partij (Contact opgezocht met KNVB; deze zegt dat de uitslagen zelf niet auteursrechtelijk beschermd zijn, minen mag als dit niet in strijd is met AV van de website en er geen andere data opgeslagen wordt).

Het data minen is op zich een optie, alleen dan ben je eindeloos aan het splitten en regexen, en vaak zijn de sites die deze data tentoonspreiden dermate brak dat splitten gegarandeerd problemen gaat geven.

Nu heb ik van een Tweaker een python script gekregen, alleen is een linux script en ik develop onder Windows. Ook die geeft niet alle output die gewenst is (Zoals bijvoorbeeld wedstrijdweek, maar dat is wel iets op te vangen door met vooraf ingevoerde records te gaan werken die geupdate worden). Deze geeft ook rauwe output welke doorzocht moet worden en gesplit. Niet handig.

Iemand anders tip/tricks of iemand die hier ook tegenaan gelopen is?

[ Voor 3% gewijzigd door Woy op 07-12-2013 10:38 ]


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 14:49
Hier alvast tipo 1: geen regexen en splits zitten gebruiken om HTML te parsen :+ .

[ Voor 9% gewijzigd door Styxxy op 06-12-2013 21:59 ]


Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 11-10 12:19

Pizzalucht

Snotneus.

RedHat schreef op vrijdag 06 december 2013 @ 21:53:
Op aanraden van een Admin hier geplaatst

...


Iemand anders tip/tricks of iemand die hier ook tegenaan gelopen is?
HTML door een parser gooien en met XPath aan de slag gaan.

Python is trouwens voor elk platform nagenoeg hetzelfde, die kun je dus ook gewoon op Windows gebruiken.

[ Voor 83% gewijzigd door Pizzalucht op 06-12-2013 22:12 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Pizzalucht schreef op vrijdag 06 december 2013 @ 22:04:
[...]


HTML door een parser gooien en met XPath aan de slag gaan.

Python is trouwens voor elk platform nagenoeg hetzelfde, die kun je dus ook gewoon op Windows gebruiken.
Hmm. Met Xpath gaat aardig snel :) Heb al zeker 6 jaar PHP niet aangeraakt dus dingen als DOM/XML ben ik nog niet geheel bekend mee. één div pakken met Xpath gaat helemaal goed, alle google oplossingen met meerdere divs niet. Maar ik ga ermee stoeien :)

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 11-10 16:28

Douweegbertje

Wat kinderachtig.. godverdomme

Ik weet niet wie die admin is, maar dit is gewoon iets 'topic waardig' hoor. Niet zomaar een reactie in de dev schuur :+

In elk geval zie ik het probleem niet om bijv dit: http://nos.nl/sport/voetb.../fase/groepen/sort/groep/ te spideren. Alles zit "netjes" in een table. Volgens mij is dat een kwartiertje werk en dan heb je alles mooi overgenomen.

Aan de andere kant: het is amper veel data te noemen. Wat is de rede dat je niet 5 minuten per dag wat scores kunt invullen?

Acties:
  • 0 Henk 'm!

Verwijderd

RedHat schreef op vrijdag 06 december 2013 @ 22:41:
[...]

Hmm. Met Xpath gaat aardig snel :) Heb al zeker 6 jaar PHP niet aangeraakt dus dingen als DOM/XML ben ik nog niet geheel bekend mee. één div pakken met Xpath gaat helemaal goed, alle google oplossingen met meerdere divs niet. Maar ik ga ermee stoeien :)
Probeer beautifulsoup.

Super simpel. Ik doe zoiets in een script:

Python:
1
2
3
4
5
6
7
8
9
soup = BeautifulSoup(html, "html.parser")

table = soup.find( id='blaat' )
table = table.find( 'tbody' )

# walk over rows in table.
for item in table.findAll( 'tr' ):
    cols = [ col for col in item.findAll( 'td' ) ]
    # cols = array van cellen van deze rij.


om een tablel in te lezen naar een db.

[ Voor 3% gewijzigd door Verwijderd op 06-12-2013 22:57 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Nouja, xpath gaat prima. Ik ken alleen de syntax niet zo goed, dus het is even eerst werkbaar maken, en dan kijken hoe het beter kan. Nu heb ik een hoop foreach lusjes, terwijl ik het liefst gewoon per contentblock alles in een array stop, zodat ik niet via vieze truukjes mijn array op de goede volgorde krijg. Leuke zoektocht :)

Voor de mensen die er misschien wat aan hebben:

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
<?php
/* Use internal libxml errors -- turn on in production, off for debugging */
libxml_use_internal_errors(true);
/* Createa a new DomDocument object */
$dom = new DomDocument;
/* Load the HTML */
$dom->loadHTMLFile("http://foxsports.nl/competitie/9-eredivisie/2013/ronde/15/wedstrijden");
/* Create a new XPath object */
$xpath = new DomXPath($dom);
/* Query all <td> nodes containing specified class name */
$nHomeTeamShort      = $xpath->query('//div[@class="who"]/div[@class="shortname home-team"]');
$nAwayTeamShort      = $xpath->query('//div[@class="who"]/div[@class="shortname away-team"]');
$nHomeTeam        = $xpath->query('//div[@class="who"]/div[@class="name home-team"]');
$nAwayTeam        = $xpath->query('//div[@class="who"]/div[@class="name away-team"]');
$nScoreHomeTeam = $xpath->query('//div[@class="score"]/div[@class="centered"]/div[@class="home-team silver-soft"]');
$nScoreAwayTeam = $xpath->query('//div[@class="score"]/div[@class="centered"]/div[@class="away-team silver-soft"]');
/* Set HTTP response header to plain text for debugging output */
//header("Content-type: text/plain");
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */
foreach ($nHomeTeamShort as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";
}
foreach ($nAwayTeamShort as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";
}
foreach ($nScoreHomeTeam as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";
}
foreach ($nScoreAwayTeam as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";

}
foreach ($nHomeTeam as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";
}
foreach ($nAwayTeam as $i => $node) {
    echo $node->nodeValue;
    echo "<br />";
}
?>

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 11-10 16:28

Douweegbertje

Wat kinderachtig.. godverdomme

Kun je niet gewoon één 'query' draaien op "div[@class="who" om vervolgens alleen dat te loopen en bij de juiste data (dus; shortname home-team, away-team etc. de data te pakken? Zo elimineer je al meerdere querys en foreach-jes. Dan heb je alleen wat if-statements (of een switch).


(nooit xpath gebruikt, dus weet het niet zeker :p)

[ Voor 8% gewijzigd door Douweegbertje op 06-12-2013 23:20 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
douweegbertje schreef op vrijdag 06 december 2013 @ 23:20:
Kun je niet gewoon één 'query' draaien op "div[@class="who" om vervolgens alleen dat te loopen en bij de juiste data (dus; shortname home-team, away-team etc. de data te pakken? Zo elimineer je al meerdere querys en foreach-jes. Dan heb je alleen wat if-statements (of een switch).


(nooit xpath gebruikt, dus weet het niet zeker :p)
Dat zal ongetwijfeld kunnen :) Ben daar nog op zoek naar. Als ik Google op 'xpath php multiple elements query' kom ik niet veel verder als wat ik al doe (Subselecties).

Ik zie soms ook in voorbeelden 'AND' terugkomen, alleen die werkt op mijn installatie niet (Want query('who AND score AND bla AND bla'); is natuurlijk veel makkelijker omdat je dan alles in 1 block krijgt.

http://stackoverflow.com/...d-values-partial-matching

PHP:
1
$nHomeTeamShort      = $xpath->query('//div[@class="who"]/div[@class="shortname home-team"] and //div[@class="who"]/div[@class="shortname away-team"]');


Hier krijg ik geen output mee, dus lijkt de and operator niet te werken.

Met pipeline count hij gewoon door, dus dan krijg je ipv 9 entry's 18 entry's. Alleen het aantal entry's hoeft niet altijd 18 te zijn, dus gewoon entry 0 t/m 8 = home team, 9t/m17 = away team gaan dan niet op. Jammer dat je met die query's niet gewoon array's kan builden. Hij doet dus wél alle entry's pakken, alleen ik kan ze niet gelijk schikken op het wat is, waardoor informatie selecteren tricky wordt aangezien ik niet altijd weet hoeveel entry's er zijn.

Dus met dit:
PHP:
1
$nHomeTeamShort      = $xpath->query('//div[@class="who"]/div[@class="shortname home-team"]|//div[@class="who"]/div[@class="shortname away-team"]');


Krijg ik als output in de foreach dit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0RJC
1TWE
2ZWO
3RKC
4HEE
5GAE
6NAC
7GRO
8HER
9UTR
10ADO
11AJA
12VIT
13CAM
14FEY
15PSV
16NEC
17AZ


Ik kan niet selecteren in de foreach op een div, en dus is de data moeilijk te scheiden...
(Hoop dat ik het duidelijk uitleg) :)

Bij 9 wedstrijden weet ik dat integer 9+ een uitteam is. Dus wil ik de data in één keer hebben zal ik alsnog data moeten gaan splitten, counten op wedstrijden (Om te weten welk id uit en thuis is)... Tja, wat is wijsheid

Nu kwam ik wel op een niet-php-site de code nextSibling tegen, die eigenlijk de volgende entry zou moeten pakken

PHP:
1
echo $node->nextSibling->nodeValue;
geeft alleen bij mij geen output, dus er zullen vast wel oplossingen zijn, dus ik blijf lekker zoeken :)

Ik zit te stoeien om gewoon het hele content-block te parsen, en dan in de foreach iets te doen met $node->getElementsByTagname('short home-team')->nodeValue; , echter werkt dat niet. Krijg onherroepelijk een error die ik niet helemaal kan debuggen

code:
1
Notice: Undefined property: DOMNodeList::$nodeValue in C:\www\www\DutchPoule\index.php on line 3


Als ik het content block kan parsen, en dan in de foreach kan selecten op tagname, dan kan ik hele mooie arrays bouwen of XML files.

[ Voor 62% gewijzigd door RedHat op 07-12-2013 00:07 ]


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 11-10 16:28

Douweegbertje

Wat kinderachtig.. godverdomme

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
<?php 
/* Use internal libxml errors -- turn on in production, off for debugging */ 
libxml_use_internal_errors(true); 
/* Createa a new DomDocument object */ 
$dom = new DomDocument; 
/* Load the HTML */ 
$dom->loadHTMLFile("http://foxsports.nl/competitie/9-eredivisie/2013/ronde/15/wedstrijden"); 
/* Create a new XPath object */ 
$xpath = new DomXPath($dom); 
/* Query all <td> nodes containing specified class name */ 
$query      = $xpath->query('//div[@class="who"]/*'); 


$i=0;
$scoreI = 1;

foreach ($query as $array) 
{
    $i++;
    $class = $array->getAttribute('class');
    $value = $array->nodeValue;

    if($class == 'score')
    {
        $value = explode(" ", $value);
        $scores[$scoreI]['homeScore'] = trim($value[0]);
        $scores[$scoreI]['awayScore'] = trim($value[1]);
    }
    else
    {
        $scores[$scoreI][$class] = $value;
    }


    

    if($i == 7)
    {
        $i = 0;
        $scoreI++;
    }
}
    echo '<pre>';
    print_r($scores);
    
?>


Dit resulteert in het volgende:

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
26
27
Array
(
    [1] => Array
        (
            [shortname home-team] => RJC
            [name home-team] => Roda JC Kerkrade
            [clublogo home-team] => 
            [homeScore] => 1
            [awayScore] => 2
            [clublogo away-team] => 
            [name away-team] => FC Twente
            [shortname away-team] => TWE
        )

    [2] => Array
        (
            [shortname home-team] => ZWO
            [name home-team] => PEC Zwolle
            [clublogo home-team] => 
            [homeScore] => 1
            [awayScore] => 1
            [clublogo away-team] => 
            [name away-team] => RKC Waalwijk
            [shortname away-team] => RKC
        )

////etc

Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 11-10 12:19

Pizzalucht

Snotneus.

Ik zou dan eerder voor zoiets gaan:

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
$DOMMatches = $xpath->query('//section[contains(@class,"match-list")]//a[contains(@class,"match")]');

$games = array();

foreach($DOMMatches as $match) {
    $gameID = $match->getAttribute('data-competition');
    $DOMDate = $xpath->query('../../header/h3/time', $match)->item(0);
    $date = $DOMDate->nodeValue;
    $rawDate = $DOMDate->getAttribute('datetime');

    $who = $xpath->query('div[@class="content"]/div[@class="who"]', $match)->item(0);
    
    $homeTeam = $xpath->query('div[@class="name home-team"]', $who)->item(0)->nodeValue;
    $homeTeamShort = $xpath->query('div[@class="shortname home-team"]', $who)->item(0)->nodeValue;
    $awayTeam = $xpath->query('div[@class="name away-team"]', $who)->item(0)->nodeValue;
    $awayTeamShort = $xpath->query('div[@class="shortname away-team"]', $who)->item(0)->nodeValue;

    $score = $xpath->query('div[@class="score"]/div[@class="centered"]', $who)->item(0);
    $homeTeamScore = $xpath->query('div[contains(@class,"home-team")]', $score)->item(0)->nodeValue;
    $awayTeamScore = $xpath->query('div[contains(@class,"away-team")]', $score)->item(0)->nodeValue;

    $games[$gameID] = array(
        'date' => $date,
        'rawDate' => $rawDate,
        'homeTeam' => $homeTeam,
        'homeTeamShort' => $homeTeamShort,
        'homeTeamScore' => $homeTeamScore,
        'awayTeam' => $awayTeam,
        'awayTeamShort' => $awayTeamShort,
        'awayTeamScore' => $awayTeamScore,
    );
}



Die "Undefined property: DOMNodeList::$nodeValue" krijg je omdat je nodeValue van een nodeList probeert te halen. Dit kan niet, je moet eerst een item van die lijst pakken. Als je zeker weet dat het er maar 1 is, kun je gewoon ->item(0)->nodeValue doen. Volgens mij kan [0] in de query ook.

[ Voor 9% gewijzigd door Pizzalucht op 07-12-2013 00:20 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:54
Ik doe dit ook al jaren voor een voetbalpooltje met een paar vrienden (alleen op dagen dat er wedstrijden zijn en dan elk kwartier). Misschien twee tips die relevant kunnen zijn:
-Gebruik een echte user agent string om de pagina te laden
-Ik scrape elk kwartier, en dan plus of min maximaal drie minuten
Dit om te voorkomen dat een oplettende admin spot dat je geautomatiseerd de site zit te scrapen en je blocked. In de toekomst wil ik het nog uitbreiden naar meerdere bronnen en dan om de beurt een bron pakken, met fallback mogelijkheden mocht de ene site meer up to date zijn dan de ander of er uit liggen of iets dergelijks, maar ja, tijd he?

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Hoop mensen infecteren met een botnet en die dan random de data op laten halen is dan misschien ook een idee ;)

https://niels.nu


Acties:
  • 0 Henk 'm!

  • console
  • Registratie: September 2002
  • Laatst online: 15:30
Grappg, ben sinds gister ook bezig met een API die resultaten terug geeft (in detail), omdat ik geen goede API's kon vinden. En dan niet alleen de Eredivisie maar ook de Bundesliga, Premier League, Primera Division etc.

Ben blijkbaar niet de enigste die hier aan ergerde :+

[ Voor 5% gewijzigd door console op 07-12-2013 12:32 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:54
Oh die zijn er wel hoor, maar betaald (en duur). Heb nog nooit een gratis api gevonden in ieder geval.

[ Voor 42% gewijzigd door sig69 op 07-12-2013 12:34 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
sig69 schreef op zaterdag 07 december 2013 @ 12:33:
Oh die zijn er wel hoor, maar betaald (en duur). Heb nog nooit een gratis api gevonden in ieder geval.
Nou, er is wel een gratis api, alleen je moet je opgeven en hopen dat je een license key krijgt. Applications duren 3 tot 4 weken, maar klagen op het forum schijnt te helpen.

http://www.footytube.com/openfooty/
Pizzalucht schreef op zaterdag 07 december 2013 @ 00:11:
Ik zou dan eerder voor zoiets gaan:

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
$DOMMatches = $xpath->query('//section[contains(@class,"match-list")]//a[contains(@class,"match")]');

$games = array();

foreach($DOMMatches as $match) {
    $gameID = $match->getAttribute('data-competition');
    $DOMDate = $xpath->query('../../header/h3/time', $match)->item(0);
    $date = $DOMDate->nodeValue;
    $rawDate = $DOMDate->getAttribute('datetime');

    $who = $xpath->query('div[@class="content"]/div[@class="who"]', $match)->item(0);
    
    $homeTeam = $xpath->query('div[@class="name home-team"]', $who)->item(0)->nodeValue;
    $homeTeamShort = $xpath->query('div[@class="shortname home-team"]', $who)->item(0)->nodeValue;
    $awayTeam = $xpath->query('div[@class="name away-team"]', $who)->item(0)->nodeValue;
    $awayTeamShort = $xpath->query('div[@class="shortname away-team"]', $who)->item(0)->nodeValue;

    $score = $xpath->query('div[@class="score"]/div[@class="centered"]', $who)->item(0);
    $homeTeamScore = $xpath->query('div[contains(@class,"home-team")]', $score)->item(0)->nodeValue;
    $awayTeamScore = $xpath->query('div[contains(@class,"away-team")]', $score)->item(0)->nodeValue;

    $games[$gameID] = array(
        'date' => $date,
        'rawDate' => $rawDate,
        'homeTeam' => $homeTeam,
        'homeTeamShort' => $homeTeamShort,
        'homeTeamScore' => $homeTeamScore,
        'awayTeam' => $awayTeam,
        'awayTeamShort' => $awayTeamShort,
        'awayTeamScore' => $awayTeamScore,
    );
}



Die "Undefined property: DOMNodeList::$nodeValue" krijg je omdat je nodeValue van een nodeList probeert te halen. Dit kan niet, je moet eerst een item van die lijst pakken. Als je zeker weet dat het er maar 1 is, kun je gewoon ->item(0)->nodeValue doen. Volgens mij kan \[0] in de query ook.
Nadeel is dat wanneer wedstrijden nog niet gespeeld zijn hij vastloopt op het niet kunnen vinden van de score (Verhoog de speelweek maar naar bijvoorbeeld 19).

Bij douweegbeertje kun je gewoon kijken of er in de array een score zit, en zoniet de hele entry verwijderen.

Maar dit werkt iig niet :)

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
foreach ($query as $array)  
{ 
    $i++; 
    $class = $array->getAttribute('class'); 
    $value = $array->nodeValue; 

    if($class == 'score') 
    { 
        $value = explode(" ", $value); 
        $scores[$scoreI]['homeScore'] = trim($value[0]); 
        $scores[$scoreI]['awayScore'] = trim($value[1]); 
    } 
    else 
    { 
        $scores[$scoreI][$class] = $value; 
    } 
   if (!isset ($scores[$scoreI]['homeScore']))
    {
        // unset $scores[$scoreI]
        // lower $scoreI--;
    }
    if($i == 7) 
    { 
        $i = 0; 
        $scoreI++; 
    } 
}

[ Voor 83% gewijzigd door RedHat op 07-12-2013 16:20 ]


Acties:
  • 0 Henk 'm!

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 11-10 12:19

Pizzalucht

Snotneus.

RedHat schreef op zaterdag 07 december 2013 @ 16:01:
[...]

Nou, er is wel een gratis api, alleen je moet je opgeven en hopen dat je een license key krijgt. Applications duren 3 tot 4 weken, maar klagen op het forum schijnt te helpen.

http://www.footytube.com/openfooty/


[...]

Nadeel is dat wanneer wedstrijden nog niet gespeeld zijn hij vastloopt op het niet kunnen vinden van de score (Verhoog de speelweek maar naar bijvoorbeeld 19).

Bij douweegbeertje kun je gewoon kijken of er in de array een score zit, en zoniet de hele entry verwijderen.

Maar dit werkt iig niet :)

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
foreach ($query as $array)  
{ 
    $i++; 
    $class = $array->getAttribute('class'); 
    $value = $array->nodeValue; 

    if($class == 'score') 
    { 
        $value = explode(" ", $value); 
        $scores[$scoreI]['homeScore'] = trim($value[0]); 
        $scores[$scoreI]['awayScore'] = trim($value[1]); 
    } 
    else 
    { 
        $scores[$scoreI][$class] = $value; 
    } 
   if (!isset ($scores[$scoreI]['homeScore']))
    {
        // unset $scores[$scoreI]
        // lower $scoreI--;
    }
    if($i == 7) 
    { 
        $i = 0; 
        $scoreI++; 
    } 
}
Beetje een non-argument, zo'n check kun je makkelijk toevoegen.

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
$DOMMatches = $xpath->query('//section[contains(@class,"match-list")]//a[contains(@class,"match")]');

$games = array();

foreach($DOMMatches as $match) {
    $gameID = $match->getAttribute('data-competition');
    $DOMDate = $xpath->query('../../header/h3/time', $match)->item(0);
    $date = $DOMDate->nodeValue;
    $rawDate = $DOMDate->getAttribute('datetime');

    $who = $xpath->query('div[@class="content"]/div[@class="who"]', $match)->item(0);
    $homeTeam = $xpath->query('div[@class="name home-team"]', $who)->item(0)->nodeValue;
    $homeTeamShort = $xpath->query('div[@class="shortname home-team"]', $who)->item(0)->nodeValue;
    $awayTeam = $xpath->query('div[@class="name away-team"]', $who)->item(0)->nodeValue;
    $awayTeamShort = $xpath->query('div[@class="shortname away-team"]', $who)->item(0)->nodeValue;
    
    $played = FALSE;
    $homeTeamScore = FALSE;
    $awayTeamScore = FaLSE;
    $score = $xpath->query('div[@class="score"]/div[@class="centered"]', $who);
    if($score->length > 0) {
        $played = TRUE;
        $score = $score->item(0);
        $homeTeamScore = $xpath->query('div[contains(@class,"home-team")]', $score)->item(0)->nodeValue;
        $awayTeamScore = $xpath->query('div[contains(@class,"away-team")]', $score)->item(0)->nodeValue;
    }

    $games[$gameID] = array(
        'date' => $date,
        'rawDate' => $rawDate,
        'played' => $played,
        'homeTeam' => array(
            'name' => $homeTeam,
            'shortName' => $homeTeamShort,
            'score' => $homeTeamScore,
        ),
        'awayTeam' => array(
            'name' => $awayTeam,
            'shortName' => $awayTeamShort,
            'score' => $awayTeamScore,
        ),
    );
}

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Pizzalucht schreef op zaterdag 07 december 2013 @ 16:25:
[...]


Beetje een non-argument, zo'n check kun je makkelijk toevoegen.

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
$DOMMatches = $xpath->query('//section[contains(@class,"match-list")]//a[contains(@class,"match")]');

$games = array();

foreach($DOMMatches as $match) {
    $gameID = $match->getAttribute('data-competition');
    $DOMDate = $xpath->query('../../header/h3/time', $match)->item(0);
    $date = $DOMDate->nodeValue;
    $rawDate = $DOMDate->getAttribute('datetime');

    $who = $xpath->query('div[@class="content"]/div[@class="who"]', $match)->item(0);
    $homeTeam = $xpath->query('div[@class="name home-team"]', $who)->item(0)->nodeValue;
    $homeTeamShort = $xpath->query('div[@class="shortname home-team"]', $who)->item(0)->nodeValue;
    $awayTeam = $xpath->query('div[@class="name away-team"]', $who)->item(0)->nodeValue;
    $awayTeamShort = $xpath->query('div[@class="shortname away-team"]', $who)->item(0)->nodeValue;
    
    $played = FALSE;
    $homeTeamScore = FALSE;
    $awayTeamScore = FaLSE;
    $score = $xpath->query('div[@class="score"]/div[@class="centered"]', $who);
    if($score->length > 0) {
        $played = TRUE;
        $score = $score->item(0);
        $homeTeamScore = $xpath->query('div[contains(@class,"home-team")]', $score)->item(0)->nodeValue;
        $awayTeamScore = $xpath->query('div[contains(@class,"away-team")]', $score)->item(0)->nodeValue;
    }

    $games[$gameID] = array(
        'date' => $date,
        'rawDate' => $rawDate,
        'played' => $played,
        'homeTeam' => array(
            'name' => $homeTeam,
            'shortName' => $homeTeamShort,
            'score' => $homeTeamScore,
        ),
        'awayTeam' => array(
            'name' => $awayTeam,
            'shortName' => $awayTeamShort,
            'score' => $awayTeamScore,
        ),
    );
}
Netjes. Weer wat geleerd :)

Voor de mensen die er wat aan hebben: Ik heb bij niet gespeelde wedstrijden het tijdstip erbij gezet (in de array), zodat je dat kunt laten zien ipv de score.

De if/else bij de score check:

PHP:
1
2
3
4
5
6
7
8
9
10
11
    if($score->length > 0) { 
        $played = 1; 
        $score = $score->item(0); 
        $homeTeamScore = $xpath->query('div[contains(@class,"home-team")]', $score)->item(0)->nodeValue; 
        $awayTeamScore = $xpath->query('div[contains(@class,"away-team")]', $score)->item(0)->nodeValue; 
        
    }
    else
    {
        $time = $xpath->query('time[@class="display-day"]', $who)->item(0)->nodeValue;
    }


En de array ziet er dan zo uit

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $games[$gameID] = array( 
        'date' => $date, 
        'time' => trim($time),
        'rawDate' => $rawDate, 
        'played' => $played, 
        'homeTeam' => array( 
            'name' => $homeTeam, 
            'shortName' => $homeTeamShort, 
            'score' => $homeTeamScore, 
        ), 
        'awayTeam' => array( 
            'name' => $awayTeam, 
            'shortName' => $awayTeamShort, 
            'score' => $awayTeamScore, 
        ), 
    );

Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
De Telegraaf-widget krijgt achter de schermen via SOAP alle gegevens en ik ken 'toevallig' O-) mensen die voor het bedrijf werken die die gegevens aanleveren.

Ik kan informeren of het mogelijk is of en tegen welke prijs je daar gebruik van kan maken (of op vergelijkbare manier; het lijkt me niet de bedoeling dat je de Telegraaf-widget onderuit kan ddossen ;) )

Gaat het alleen om de uitslagen (+ clubnamen + datum/tijd)? Of wil je ook wie gescoord heeft? Gele, rode kaarten? Balbezit? Wie naar wie gepassd heeft en met welke voet en vanaf welke plaats in het veld? Niets zeggende getallen (voor mij dan :+) over de teams/spelers die uit door afgestudeerde en zelfs gepromoveerde econometristen bedachte rekenmodellen komen rollen?

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Puur uitslagen, de rest is niet nodig 😉

Acties:
  • 0 Henk 'm!

  • thepercival
  • Registratie: Juli 2009
  • Laatst online: 24-10-2022
Hoi,

Ik scrape fcupdate.nl, dit gaat prima. Zie *spam*
Zo kun je ook een line van een speler binnenhalen, kaarten, goals, wissels, etc.

Mocht je info hierover willen dan hoor ik het. Mijn gegevens zijn te vinden in de footer van *spam*

gr Coen

[ Voor 15% gewijzigd door NMe op 28-01-2016 11:59 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het lijkt me sterk dat de topicstarter na ruim 2 jaar nog steeds met hetzelfde probleem zit en zelfs als dat wel zo was ben je wel heel erg overduidelijk je eigen site aan het spammen nu. Hij kan je ook via je profiel bereiken als 'ie je nodig heeft.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.