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

Publié par Fobec dans java

Les images statiques sont aussi devenues payantes chez Google. Donc sans compte et une cle, l'image ne se chargera pas.
Je vous conseille de passer sur un autre fournisseur de carte, le code re...

Publié par Fobec dans CMS

Norton emet une alerte de type 'Suspicious.Cloud', hasard de compilation ou menace serieuse ? Faites attention en installant le logiciel.<br>Merci JM de l'avoir signaler.

Publié par Axel dans java

Bonjour,
cet exemple a ete prepare et compile sous Netbeans 7.2 ;)
S'il y a un soucis, n'hesite pas

Publié par FOBEC dans CMS

Un chronomètre, des challenges et l'affichage des meilleurs scores sont prévus. Si ça vous intéresse, laissez moi un p'tit mot !!!

Publié par Vincent dans tuto

Sympa votre petit script :) Oui il existe des bibliotheques deja toutes faites mais elles sont en general 50x plus lourdes que ce petit bout de code qui fait exactement ce qu'il faut. En plus votr...