Content van een andere site halen

Status
Niet open voor verdere reacties.

Tr0jan

Gebruiker
Lid geworden
19 dec 2008
Berichten
142
Hallo,

Ik wil de Slam!40 op mijn site laten weergeven, van (http://slamfm.nl/page/musicslam40)

Ik weet wel dat daar een manier voor is met php, maar geen idee hoe je dat moet doen en hoe het werkt..
Iemand hier misschien ervaring mee/iemand die me dit zou kunnen uitleggen?
 
Je kunt file_get_contents ( $url ) gebruiken, dan krijg je de pagina terug als een string waar je mee kunt werken.

Er zijn vast ook andere manieren die makkelijker zijn.

Maar voordat je begint zou ik even uitzoeken of je toestemming hebt om dat te doen, want het is meestal niet toegestaan om zomaar content van een andere website te plukken.
 
Het probleem bij het parsen van andermans data is vaak dat de layout van het bronbestand niet ideaal is. Ook hier gooien newlines op onlogische plaatsen roet in het eten en ook de drievoudige "rating" class helpt niet mee.

Neemt niet weg dat het uiteraard mogelijk is om de data eruit te vissen,maar je moet er wel rekening mee houden dat zo'n script fouten zal geven wanneer de layout van de code van slamfm wordt aangepast. Een voorbeeld:
PHP:
<pre>
<?php
	//data ophalen en schoonmaken
	$raw = file_get_contents("http://slamfm.nl/page/musicslam40");
	$tidy = new tidy;
	$tidy->parseString($raw);
	$tidy->cleanRepair();
	$raw = $tidy;
	
	//begin en einde van html wissen, boel opschonen
	$zoek = '<div class="chart" id="printslam40">';
	$pos = stripos($raw,$zoek);
	if ($pos === false) {
		echo $zoek.' is niet gevonden';
	} else {
		$raw = substr($raw,($pos+strlen($zoek)));
	}
	$zoek = '</div>';
	$pos = stripos($raw,$zoek);
	if ($pos === false) {
		echo $zoek.' is niet gevonden';
	} else {
		$raw = substr($raw,0,$pos);
	}
	$raw = str_replace('dt class="rating"','dt class="positie"',$raw);
	$raw = str_replace('class="odd"','',$raw);
	$raw = str_replace('class=""','',$raw);
	
	//alle echte data in een array zetten, checken en verwerken
	preg_match_all("/class=\"(.*)\"\>(.*)\</",$raw,$tmp);
	$check = count($tmp[1])/40;
	if (!is_int($check)) {
		die("array bevat geen veelvoud van 40");
	} else {
		$uitvoer = array();
		for ( $counter = 0; $counter < 40*$check; $counter += $check) {
			$kek = array_splice($tmp[1],0,$check);
			$kek[1] = "vorige";
			$kek[2] = "weken";
			$uitvoer[] = array_combine($kek,array_splice($tmp[2],0,$check));
		}
		echo print_r($uitvoer);
	}
?>
</pre>
$uitvoer bevat nu de complete hitlijst als array, alle andere code is weggestript. Ik wist geen mooie manier om de ongelukkige newline in elke titel weg te werken, dus daarom heb ik de code door tidy gehaald (regels 5 t/m 7). Op een aantal plaatsen (regels 25, 38 en 39) heb ik de "rating" omschrijving aangepast omdat array_combine anders niet snapt wat de bedoeling is ;)
 
Ah! Dat ziet er zeer nice uit:o
Alleen krijg ik de volgende error:
Code:
Fatal error: Class 'tidy' not found in /home/zjqblxon/domains/nukefm.nl/public_html/nuke40.php on line 4
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan