Récupérer le contenu d’une page Web avec PHP

Dans ce billet je diffuse un script qui utilise la bibliothèque PHP « Curl ». Cette bibliothèque permet d’interagir avec une page Web distante.

Vous pouvez générer des requête POST ou GET, récupérer le code source de la page, manipuler les éléments distants….

La bibliothèque se travail en local avec un serveur Apache.

Le morceau de code ci-dessous se connecte au site Wikipedia sur la Page « Megadeth » et vous affiche le titre de la page. Il fait appel à des notions de Javascript (DOM), de PHP avec des expressions régulières.

Libre à vous de travailler ce code pour l’adapter suivant vos besoins.

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
<?php
//La page qu'on veut utiliser
$wikipediaURL = 'http://fr.wikipedia.org/wiki/Megadeth';

//On initialise cURL
$ch = curl_init();
//On lui transmet la variable qui contient l'URL
curl_setopt($ch, CURLOPT_URL, $wikipediaURL);
//On lui demdande de nous retourner la page
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//On envoie un user-agent pour ne pas être considéré comme un bot malicieux
curl_setopt($ch, CURLOPT_USERAGENT, 'Le blog de Samy Dindane (www.dinduks.com');
//On exécute notre requête et met le résultat dans une variable
$resultat = curl_exec($ch);
//On ferme la connexion cURL
curl_close($ch);

//On crée un nouveau document DOMDocument
$wikipediaPage = new DOMDocument();
//On y charge le contenu qu'on a récupéré avec cURL
$wikipediaPage->loadHTML($resultat);

//On parcourt les balises <div>
foreach($wikipediaPage->getElementsByTagName('div') as $div){
//Si l'id de la page est bodyContent
if($div->getAttribute('id') == <bodyContent>){

//On met le contenu du premier <p> dans une variable
$premierP = trim($div->getElementsByTagName('p')->item(0)->nodeValue);
//Si le premier <p> est vide ou ne contient pas du texte
while($premierP == '<br>' || $premierP == '<br />' || $premierP == ''){
//On le supprime
$div->removeChild($div->getElementsByTagName('p')->item(0));
//Et on passe au <p> suivant
$premierP = trim($div->getElementsByTagName('p')->item(0)->nodeValue);
};

//Un joli try pour éviter les messages d'erreur
try{
//On parcourt toutes les tables
foreach( $div->getElementsByTagName('table') as $table ){
//Et on les supprime
$div->removeChild($table);
}
} catch(Exception $e){
//On censure :P
}

//On récupère le contenu de la fameuse balise <p> dans une variable
$description = '<p>' . $div->getElementsByTagName('p')->item(0)->nodeValue. '</p>';
}
}

//On enlève la syntaxe propre à Wikipedia
$description = preg_replace('/\[[0-9]*\][,]|\[[0-9]*\]/', '', $description);

//On affiche de résultat
echo $description;

?>

Le script présenté ci-dessus est diffusé par dinduks.com qui à fait un très bon tuto avec des exmples illustrés sur cette bibliothèque.

Add a comment »7 comments to this article

  1. Bonjour,
    j’ai essayé ton script mais je n’ai qu’une partie de la page et avec des partie en erreur 404.
    En fait mon but est d’intégrer dans mon site wordpress les résultats/classements de mon équipe de basket depuis le site de la ffbb.
    Peux-tu m’aider stp?

    Merci infiniment.

    Répondre

    • Salut, je t’ai contacté sur ton email

      Cdlt

      Répondre

      • Bonjour,
        Je souhaite creer un site pour mon club de basket sur wordpress et je voudrai savoir s’il est possible de recuperer les resultats /classements presents sur le site de la federation?
        Merci d’avance

        Répondre

      • Salut

        Etant dans le même cas de figure, je suis bien curieux de savoir si vous avez trouvé une solution au problème…

        Répondre

        • Bonjour, l’article ci-dessus détail une procédure sur un exemple donné, théoriquement celle-ci s’applique sur tout type de site et data, je ne peux pas écrire les scripts pour tout les visiteurs.

          Une grande tasse de café, quelques heures à manipuler CURL et vous arriverez à parser ce que vous souhaitez !

          Bon courage !

          Répondre

  2. Bonjour Tinei,
    j’ai déjà rencontré cette erreur quand j’ai lancé une boucle sur plusieurs sites.
    Par exemple, je charge le contenu de 200 sites à la suite. Dans ce cas, il semblerait que les sockets prennent trop de retard et que le contenu n’arrive plus à être géré par le script php.

    Je te conseille de débugger :

    $ch = curl_init();
    $timeout = 5; // set to zero for no timeout
    curl_setopt ($ch, CURLOPT_URL, ‘http://ton_url’);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $file_contents = curl_exec($ch);
    //vérifie le contenu de $file_content

    $html = str_get_html($file_contents);
    //vérifie le contenu de $html

    Répondre

  3. Bonjour.
    Ça ne marche pas.
    Etant sur Google Chrome, quand je lance la page:

    Erreur HTTP 500 (Internal Server Error) : Une situation inattendue s’est produite tandis que le serveur tentait de traiter la demande.
    Cela peut être dû à une opération de maintenance ou à une configuration incorrecte.

    Ce message apparaît souvent quand on a une erreur dans le php.
    Peut-être y a t-il une erreur ? Pouvez-vous vérifier ?

    Répondre

Laisser un commentaire

Assemblé dans la station orbitale WordPress