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 5711 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par romainN dans tuto

Bonjour,

Super tuto bravo! Je suis sur Wordpress 3.5 et 1and1 et la ligne HTML que je dois modifier est prsente dans plusieurs php et elle comprend des echo:

echo \\ dans le fichier wp-...

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

Publié par Adresse IP dans news

Je cherche un moyen pour afficher une correspondance entre adresse IPv4 et adresse IPv6 sans possibilite d'installer le protocole ipv6. Comment faire J'ai vu qu'il existait des possibilites de faire...

Publié par foufou0406 dans CMS

merci !!!

Publié par Amal dans tuto

pour moi j'ai créé une liste déroulante en liaisant avec la base de donnée déja existant mais la valeur sélectionné ne peut pas etre afficher jamais et...