Publié le 19/05/2011
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Enregistrer une page internet dans un fichier

Charger un fichier sur un serveur web est une opération de base de tout navigateur internet. En PHP, la fonction file_get_contents() ou encore l'extension curl facilitent le chargement de contenu. Toutes les fonctions utilisent une communication via les sockets pour communiquer avec le serveur distant.

Charger une page HTML avec les sockets

La class FileGetContent reprend une à une les fonctions pour communiquer avec un serveur web:
- Ouvrir une connexion avec fsockopen,
- Envoyer la commande GET au serveur web,
- Ecouter le port 80 et réceptionner les données
- Enregistrer le code HTML dans un fichier.
<?php
/******************************************************************************
* Enregistrer une page internet dans un fichier
* @copyright Fobec 2011
******************************************************************************/
class FileGetContent {
 
    static public function save($url,$filename) {
/****************************************
* Décomposer l'url
****************************************/
        $urlpart=parse_url($url);
        if (!isset($urlpart['host'])) {
            throw new Exception("Invalid URL");
        }
 
/****************************************
* Ouvrir une connexion
****************************************/
        $fp = fsockopen($urlpart['host'], 80);
        if (!$fp) {
            throw new Exception("Socket not open");
        } else {
            $path='/';
            if (isset($urlpart['path'])) {
                $path=$urlpart['path'];
            }
 
/****************************************
* Envoyer la commande GET au serveur
****************************************/
            $out = "GET ".$path." HTTP/1.0rn"; //
            $out .= "Host: ".$urlpart['host']."rn";
            $out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17rn";
            $out .= "Connection: Closernrn";
            fwrite($fp, $out);
 
/****************************************
* Ecouter le port 80 et receptionner les données
****************************************/
            $buf='';
            while (!feof($fp)) {
                $buf.=fgets($fp);
            }
            fclose($fp);
 
/****************************************
* Effacer le header
****************************************/
            $p=strpos($buf,"rnrn");
            if ($p!==false) {
                $buf= substr($buf, $p);
            }
 
/****************************************
* Enregistrer le code HTML dans un fichier
****************************************/
            $ft = fopen ($filename, "a");
            fputs ($ft, $buf);
            fclose ($ft);
        }
    }
}
?>
Note: la redirection n'est pas traitée.

Enregistrer une page HTML

Comment enregistrer le code HTML de la page d'accueil dans le fichier tmp.html. La class automatise les fonctions suivants:
- ouverture d'une connexion avec le serveur distant,
- envoi de la requête HTTP,
- réception puis enregistrement du code source.
<?php
FileGetContent::save('http://www.fobec.com/CMS/index.php', $_SERVER['DOCUMENT_ROOT'].'/tmp.html');
?>

La class illustre une communication client-serveur avec les sockets. Dans notre cas, le contenu de la page HTML est enregistré dans un fichier.
Le script est à utiliser avec précaution car il ne gère pas les timeout, les redirections et les codes d'erreur.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - class
Mise a jour
19/05/2011
Visualisation
vu 6257 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 263 articles
|BIO_PSEUDO|
Commentaires récents

Publié par IB dans tuto

On ne voit pas le gros bouton rouge 'Download' pour charger les 3 scripts, dont vous parlez sur le site

Publié par Fobec dans java

oups quelques lignes manquent sur ce code ! ... l'exemple est corrige et complet
Merci Tom

Publié par deefaze dans CMS

Label1.Caption := format(\'Red: $%.2x, Green : $%.2x, Blue : $%.2x\',[R,G,B]);

:)

Publié par claude77 dans tuto

Super application, fonctionne bien
exemple sur une image

Publié par jerome dans php5

Excellente classe, merci pour ce petit code qui va me permettre de me passer de ma page igoogle qui ferme vendredi