Publié le 19/05/2011
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
1 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.
avatar Deepan

Publié par Deepan

le 20/07/2020 à 16:54:02

Bonjour,
Merci pour ce tuto qui m'a bien aide.
Je donne ici les modifications apportees pour que cela fonctionne chez moi.

/****************************************
* Ouvrir une connexion
****************************************/
$opts = array(
'http'=>array(
'method'=>"GET",
'protocol'=>"HTTP/1.1" ,
'user-agent'=>$_SERVER["HTTP_USER_AGENT"],
'header'=>"Accept-language: en\r\n"
)
);

$context = stream_context_create($opts);

/* Envoi une requete HTTP avec les en-tetes additionnels ci-dessus */
$fp = fopen($url, 'r', false, $context);

Je recupere bien la page HTML dans le fichier.

Bon courage a tous

A lire aussi

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

Publié par pacman dans java

thanks for sharing, that s great!

Publié par fobec dans logiciel

MAJ: migration vers GoogleMap V3 de la carte

Publié par hungerGames dans php5

Salut!
je suis un debutant en php,et lorsque j'ai execute le code
sur la creation de la base 'member',on m'a affiche cet message:
"Undefined class constant 'ATT_ERRMOD...

Publié par Mohamed dans java

Merci beaucoup j'ai eu un probleme de redimensionnement des images , mes images perdaient leur qualite, ta solution m'a aide pour ca mercii

Publié par claude77 dans tuto

Super application, fonctionne bien
exemple sur une image