begin process at 2012 05 27 18:18:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > RECUPERER UNE PAGE SUR INTERNET

RECUPERER UNE PAGE SUR INTERNET


 Information sur la source

Note :
6,14 / 10 - par 7 personnes
6,14 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Niveau :Initié Date de création :08/05/2005 Vu / téléchargé :11 752 / 340

Auteur : GillesWebmaster

Ecrire un message privé
Commentaire sur cette source (38)
Ajouter un commentaire et/ou une note

 Description

Dans certaines applications, on peut être amené à récupérer ou à afficher des pages qui se trouvent sur un site internet distant.

Source

  • $nom_fichier = "http://www.serveur.com/index.html";
  • $fp = fopen($nom_fichier, "r");
  • if(!$fp)
  • {
  • echo "Erreur d'ouverture du fichier \"".$nom_fichier."\"<br />\n";
  • exit;
  • }
  • $contenu =fread($fp, filesize($nom_fichier));
  • echo $contenu;
  • fclose($fp);
$nom_fichier = "http://www.serveur.com/index.html";
$fp = fopen($nom_fichier, "r");
if(!$fp)
{
echo "Erreur d'ouverture du fichier \"".$nom_fichier."\"<br />\n";
exit;
}
$contenu =fread($fp, filesize($nom_fichier));
echo $contenu;
fclose($fp);

 Conclusion

La commande fread lit un certain nombre de caractères dans le fichier. Pour connaître le nombre de caractères à lire, j'ai utilisé la fonction filesize, qui donne la taille du fichier

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture VIGNETTE EN RECADRANT AVEC TAILLE FIXE!
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C
Source avec Zip Source avec une capture CARTE DE L'EUROPE EN FONCTION DES VISITEURS
XML AVEC SIMPLE XML
TEMPS D'EXECUTION

 Sources de la même categorie

AFFICHÉ SUR UN TABLEAU AVEC PAGINATION ET BASE DE DONNÉES par stormxp
Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000

Commentaires et avis

Commentaire de garfield90 le 08/05/2005 11:32:40

La même chose en 1 ligne;

include "http://www.monsite.com" ;

mais cependant ton source peut etre intéressant pour montrer la lecture de fichier (cela dit, sans grand intérêt non plus)

Commentaire de GillesWebmaster le 08/05/2005 12:52:49

oui bien sur mais c'est un bon moyen pour pouvoir modifier l'"include"...
sinon tu as raison, l'include c'est plus simple...
G_____

Commentaire de coucou747 le 08/05/2005 13:05:19 administrateur CS

sinon, t'as
echo implode(file($filename));
qui est moins rapide qu'include, mais qui pourrait permetre de récupérer ça dans une variable...

enfin pour moi ça ressemble plus à un hello world qu'a une page...

une source comme ça, on peut en faire des dizaines en une journée, imagines l'état de la bdd de phpcs si on postait tous des sources comme ça.... çz ne mérite pas initié, juste débutant...

Commentaire de garfield90 le 08/05/2005 13:59:28

Faut préciser dans les commentaire que le but est de pouvoir modifier la page importée si on le souhaite.


Commentaire de GillesWebmaster le 08/05/2005 16:07:30

Oui bien évidemment...

Commentaire de fyav le 09/05/2005 12:56:08

en fait cela peut servir pour de la "marque blanche"
c'est d'ailleurs le principe utilisé par le réseau de petites annonces en marque blanche :Mixad
cela permet pour le fournisseur de contenu (ex: mixad) de rester maître de sa base de donnée et de l'affichage
et pour celui qui l'utilise en marque blanche (tiscali, le neuf, M6, les Echos, etc....) d'avoir un service qui reste sur son site avec une personnalisation pratiquement totale.....

Commentaire de Steph666 le 10/05/2005 10:40:50

Salut,

sinon y a aussi

$contenu = file_get_contents("http://www.serveur.com/index.html");

Commentaire de Antidote le 16/05/2005 19:37:58

FYAV aujourd'hui ce type de technique est totalement obslète, une boutique en marque blanche envoie tout sont catalogue en xml. c'est plus simple, maniable, et on garde les même avantages. exemple : Florajet, kelkoo, msn et zdnet etc ^_^

Sinon gardons ce principe puisque c'est le sujet, le dit "site en marque blanche" aspire donc une page avec un formulaire, l'utilisateur rempli et post ce formulaire. Comment tu récupère la page de résultat ?

(j'ai la solution) à vous de réfléchir.

Commentaire de fyav le 17/05/2005 09:16:06

en fait je parle d'un système en marque blanche qui ne permet pas aux "partenaires" de pomper la base purement et simplement, je suis sur un projet de consultation d'une base sur plus de 50 critères de recherche. ça sera mon gagne pain, et je veux garder la maitrise (c'est à dire empécher le "pompage" pur et simple de ma base, en arretant tout internaute (y compris les moteurs de recherche) de faire des requetes.
je pense voir le principe xml: tu cré un catalogue static que tes partenaires font des requêtes dessus, dis moi si je me trompe ?

pour ce qui est de récupérer la page de résultat: en fait, tous les liens qui sont sur la page récupérée vont sur la même page du partenaaire avec des gets ou des posts + l'addresse de la page à ouvrir, un petit exemple:
www.partenaire.com/recup.php:
<?php
$numpartenaire=001;//c'est le numéro d'identification du partenaire
//là c'est le début d'url de mon site
$url='http://www.monsite.com/recherche.php?numpartenaire='.$numpartenaire.'&';
//ici on récupère tout ce qui a été envoyé en post, get et cookie
//afin de le renvoyer à mon url pour traitement
foreach($_REQUEST as $key=>$elem) {$url.=$key.'='.urlencode($elem).'&';}
include($url);
?>

et dans www.monsite.com/recherche.php, toutes les url auront la forme de :
www.partenaire.com/recup.php?.............etc.........

ça permet à l'internaute de n'y voir que du feu étant donné qu'il reste sur la même page

Commentaire de Antidote le 17/05/2005 19:10:18

D'accord pour ton expliquation, mais tu es obligé de transposer en Get , si la page "monsite" nécessite une session et/ou des données en Post ça coince.

Pour ce qui est de la protection de ta  base de donnée je suis un peu plus perplexe. Ton système sera l'interface entre une grosse base et ton client. Ton client au final il a les données donc des données de la base, petit à petit il peu au moins reconstruire avec ses résultat une partie de ta base.

Bref la comparaison avec XML, le principe est le même, on récupère un fichier que l'on peux parser, transformer etc ... tant qu'il y a des données dans le fichier. Justement xml à été conçu pour ceci : Faire de xml un moyen homogène de transport de donnée pour tout type d'interface. C'est un moyen adapté. avec SOAP par exemple pour monté un webservice par exemple.
Tu gagne en qualité de prestation de service !
Pour ton gagne pain que va tu dire à tes clients quand faudra leur annoncé qu'il doivent créer un encodage php pour aller eux même chercher un fichier sur ton serveur ?
XML peut te permetre par exemple accoupler au XSL de monter des template pour eux etc ...

Commentaire de fyav le 18/05/2005 08:50:35

réponse question 1: pour ce qui est du post ou du get ou cookie, il n'y a pas de problème

réponse question 2:
la base de données a une mise à jour qui modifie d'environ 30% le total des données (adresses de fournisseurs), par an.
donc pour pomper la base il faut le faire tous les ans. Et avec des systèmes qui limite les requêtes en fonction de l'adresse ip, ou par le biais d'une vérification visuelle (style inscription à hotmail), il faut un être humain qui fasse les requêtes, je lui souhaites bonne chance, et le jeu n'en vaut pas la chandelle (coût ptohibitif par rapport aux données acquises).

réponse question 3:
je suis d'accord avec toi, sauf que mon concept est, comme celui de mixad, fournir des informations, et pour mes partenaires, ils n'ont rien à développer, juste à mettre 2 pages php où ils personnalisent le html, et c'est tout : pas de programmation, rien à faire.
Inscrit toi au système mixad et installe le sur un de tes sites, tu comprendras la simplicité de la chose pour les partenaires....

Commentaire de DarkM60 le 18/05/2005 20:05:11

$codehtml = file("$url");
echo $codehtml;

ça va un peu plus vite ^^

et pour afficher la source faut faire un html special chars ;)
Voili voilou

Commentaire de Antidote le 18/05/2005 21:23:56

Fon code affichera : " array ".
file() renvoie un tableau ...  array file ( string filename [, int use_include_path [, resource context]] )

$codehtml = file($url); // sans guillemet svp ^^

foreach($codehtml as $line) {
    echo $line;
}

ceci serait mieux. ;)

Avec file() tu ne peux pas stopper la récupération de la source en plein milieu par exemple (une fois que tu as reçu les données que tu attendais, pour éviter de récupérer une fin de page qui de toute façon ne te servira pas) bref tu ne peut pas " accélérer ton script " ou l'optimiser si on veut.

Personne n'a encore parler des sockets ? un poil plus complexe mais c'est la solution ultime pour passer des formulaires, se loguer a distance,  garder des sessions, cookies, https ... et pourquoi se limiter à ça ? ftp etc ^^ voir la librairie " curl " pour ceux qui ne veulent pas trop se prendre la tête avec les entetes html etc .. ^^

Commentaire de Antidote le 18/05/2005 21:24:35

arf désolé pour le double postage

Commentaire de coucou747 le 19/05/2005 18:22:09 administrateur CS

un implode est mieux qu'un foreach

Commentaire de GillesWebmaster le 19/05/2005 19:16:08

Oui bien sur

Commentaire de Antidote le 19/05/2005 20:12:32

Je ne sais pas lequel serait le plus rapide ?

Commentaire de coucou747 le 19/05/2005 20:16:39 administrateur CS

implode car t'as pas de boucles et moins d'instructions exécutés...

Commentaire de Antidote le 19/05/2005 21:16:58

Bien j'ai regardé sur 1 000 000 d'occurence dans un tableau voici les résultats :

-- Implode()
time : 71.19
-- Foreach()
time : 19.86

Foreach semble bien plus rapide. je demande aux autre si vous voulez bien testé vous même ça serais bien intéressant.

Commentaire de Antidote le 19/05/2005 21:59:34

En poussant un peu la chose toujours sur 1 000 000 d'occurences

-- Implode()
time : 55.38

-- Foreach()
time : 20.46

-- For()
time : 19.98

-- While()
time : 19.77

-- Do While()
time : 20.14

Commentaire de coucou747 le 19/05/2005 22:03:14 administrateur CS

avec un gros fichier :

temps d'exécution pour 10000 calculs
echo implode(file('exp_reg.html'));
6.09268498421
$a=file('exp_reg.html'); foreach ($a as $b){ echo $b; }
7.1317961216
$a=file('exp_reg.html'); foreach ($a as $b) echo $b;
7.10109400749

en fait, t'as raison pour les petits fichiers... car il n'y a pas bcp de tours de boucle, mais pour quelquechose de plus gros...


j'ai aussi un test qui est un peu plus représentatif des effets des acolades...
temps d'exécution pour 100 calculs
echo implode(file('exp_reg.html'));
0.0633730888367
$a=file('exp_reg.html'); foreach ($a as $b){ echo $b; }
0.0818321704865
$a=file('exp_reg.html'); foreach ($a as $b) echo $b;
0.0741288661957

100 calculs, c'est pas énorme, mais sinon, c'est carément lent... ces tests ont étés réalisés sur un céléron 2.4 ghtz, le fichier faisait 25311 octets 239 lignes...

En php, on manipule souvent des fichiers de plus de 200 lignes...

pour un fichier légèrement plus petit :
temps d'exécution pour 10000 calculs
echo implode(file('TESTS.php'));
1.23162293434
$a=file('TESTS.php'); foreach ($a as $b){ echo $b; }
1.48697495461
$a=file('TESTS.php'); foreach ($a as $b) echo $b;
1.48499512672

et pour un fichier de très petite taille :
temps d'exécution pour 10000 calculs
echo implode(file('1fo.php'));
0.861632823944
$a=file('1fo.php'); foreach ($a as $b){ echo $b; }
0.837021112442
$a=file('1fo.php'); foreach ($a as $b) echo $b;
0.827816963196

mais les diférences ne sont pas notables pour des fichiers de petites tailles, donc implode est préférable...

Commentaire de Antidote le 20/05/2005 01:11:08

J'ai fais mes test sans charger un fichier au prélable je remplissait un tableau d'occurences, les premier test ont été fais sur un tableau au occurence croissante en taille : $tbl[0] = 0; $tbl[1000] = 1000; $tbl[1000000] = 1000000;

J'ai fais une deux série avec une valeur constante $tbl[0] = 'bonjour'; $tbl[1000000] = 'bonjour'; Les résultat différent quelques peu en observant que du coup du plus rapide au plus lent (mais très serrer) for() -> foreach() -> do while() -> while() -> implode()

Avec un texte encore plus long genre "ceci est une phrase très très très très longue qui va faire bien ramé mon pc" Les résultats sont similaire à avant.

Perso je préfère les boucles, je travail sur des bases de données qui dépasse le million d'enregistrement ou sur des catalogues produits avec des fichiers de plusieurs millier de ligne, quand je fait des extractions le fait d'avoir une boucle à un avantage indéniable le fait de " travailler à flux tendu " par exemple je reçois les echo au fur et à mesure avec un implode je recevrais tout d'un bloc, le serveur mettrait tout en ram et saturerait très vite. Ainsi ce n'est pas le cas. Il reste que le implode sur de petite structure est plus simple à coder et à relire ^^

PS : J'utilise pour chaque boucle des accolades (testé sur un athlon 1800+) J'ai fait qu'une série de test sinon j'en avais pour des heures ^^

Commentaire de coucou747 le 20/05/2005 18:05:05 administrateur CS

ça n'utilises que deux fois plus de ram...
En théorie, le ram n'est pas super étendue, mais en pratique, on arrive aux 64 ko du dos seulement quand on manipule des images (sprites) et en php, on ne dépasse jamais les quelques mo de ram autorisés...

mes tests sont indéniables et rejoignent la théorie...

Commentaire de Laurent00777 le 04/06/2005 17:31:39

Ben moi, avec PHP5 (via WAMP)que j'ai récement installé,  j'ai l'erreur suivante:

Warning: filesize() [function.filesize]: stat failed for http://www.google.ch/search?hl=fr&q=test&btnG=Rechercher&meta= in C:\monArborescence\...\monDossier\recuperer_page.php on line 9

Warning: fread() [function.fread]: Length parameter must be greater than 0. in C:\monArborescence\...\monDossier\recuperer_page.php on line 9

Je n'arrive pas à utiliser fopen pour une page web (par ex.: http://www.google.ch/search?hl=fr&q=test&btnG=Rechercher&meta=). Pareil, mes cookies et mes session PHP4 répondent plus avec PHP5...

ça vient d'où ?

Commentaire de Roukof le 16/06/2005 11:14:17

Hello,

Je suis programmateur amateur, pour mon loisir en php.
J'arrive à récupérer une page normale, mais je voudrais récupérer des pages sur un site qui nécessite un log-in et un mot de passe.

Lorsque je fais
$fich = "http://www.site.fr/home/index.php";
fopen ($fich,"r"), etc.

Je n'ai que la page d'erreur d'identification qui s'affiche (page style : "Attention login ou mot de passe incorrect !")

Pourtant, lorque je me log sur le site normalement, et qu'ensuite je change de suite, puis tappe l'adresse ci-dessus dans mon navigateur, à laquelle il faut normalement être loggé pour pouvoir accéder, ça marche, j'arrive sur le site tout loggé.

Mais mon script refuse de procéder avec la même facilité, on le rebute toujours sous prétexte qu'il n'est pas loggé.

J'ai essayé de contourner le pb en essayant de récupérer dans mon script php la page d'arrivée du formulaire d'identification qui permet d'entrer sur le site, qui, transcrie en GET, se présente comme suit :
http://www.site.fr/authent/index.php?log=mon_login&pwd=mon_pass
mais ça ne marche pas non plus, cela m'affiche toujours la page d'erreur d'identification. Pourtant lorsque je tappe l'adresse
http://www.site.fr/authent/index.php?log=mon_login&pwd=mon_pass
dans la barre d'adresses du navigateur ça marche, je me log ainsi, en GET.

Que dois-je mettre dans mon script pour que je puisse récupérer à volonté des pages de ce site qui recquiert un login et un mot de passe pour consulter ses pages, sachant que j'en ai !

Merci de votre aide !

Nicolas

Commentaire de garfield90 le 16/06/2005 11:36:59

Roukof,

Premierement, utilisé la method GET pour une identification est une grosse abérration (c'est le systeme le plus sur pour ce faire prendre son identitée)

De plus, une fois que tu es identifié, le site utilise surement un systeme de Session ou alors de cookies ( histoire d'etre encore moins sur).

En gros, si tu t'es identifié et que le cookies ou la variable de session est existante et OK alors tu peux naviguer.

Piquer une page avec ce systeme ( fopen) ne creer pas de cookies ni de sessions donc pour le site distant tu n'es pas identifié, donc tu obtiens la page d'erreur. (sinon a quoi sert l'identification)

J'espere avoir été clair.

Je ne crois pas que ce soit contournable et heureusement sinon très grosses failles de sécurité.

Commentaire de coucou747 le 16/06/2005 11:52:57 administrateur CS

entre nous, quand il y a session, il y a souvent cookies (ou passage de variables par get...)

Commentaire de garfield90 le 16/06/2005 12:09:51

Coucou747,

a quoi sert la method POST ( je ne parlais qu'au niveau de l'identification )

Quant au cookies, j'ai pas trop ca pour la gestion des identifications ( pour ma part, les sessions sont gerées uniquement par le serveur, ou alors je suis pas au courant et j'aime pas ca)

Je prefere tout controler et eviter que quelqu'un bidouille mes fichiers de connexion.
(Le programmeur est un mec qui a tout pouvoir sur son programme, au dessus du patron ;), laisse moi mes reves ;) )

De toutes facons, je suis comme mon avatar, je n'aime les cookies que lorsqu'ils se mangent ;)

Commentaire de coucou747 le 16/06/2005 12:25:32 administrateur CS

renseignes toi sur les sessions et le protocol http...


Comment fait php pour savoir quel fichier de session assigner à un client ??? bah il lui poste un cookie quand il cré le fichier, c'est aussi simple que ça !

Commentaire de Roukof le 16/06/2005 12:42:00

Merci à tous.

Donc en gros :

y a pas moyen de chopper ces pages dans un script php, même si j'ai un login et un mot de passe valables ?

Commentaire de coucou747 le 16/06/2005 12:51:59 administrateur CS

faut voir le code de la page qui t'identifie...

Commentaire de ozskry le 14/07/2005 12:37:25

Comment faire pour récupérer une partie précise du fichier distant ?

Commentaire de coucou747 le 14/07/2005 16:10:49 administrateur CS

tu utilises substr...

Commentaire de ozskry le 14/07/2005 16:26:42

Mmmmh, d'accord, je connaissais substr() mais si je veux extraire un tableau perdu au milieu d'une page par ex, je fais comment ? Il faut que je connaisse le nb de caractère jusqu'à la table. Pas évident…

Commentaire de jonak le 21/12/2005 07:01:31

bonjour,

J'aimerai pouvoir stocker dans une variable le code source d'une page se trouvant sur un autre site afin de pouvoir utiliser une partie du code dans une page de mon site en dynamique.

Une fois récupéré dans la variable je sais faire le netoyage du code pour ne garder que la partie qui m'est utile et ainsi afficher une partie des informations du dit site.

Le but étant d'apporter l'information d'un site qui n'as pas de flux RSS et de faire des lien ensuite vers celui ci. D'ou le fait que je voudrais parser le code sources de la page en question.

Pouvez vous m'éclairer je m'y perd un peut dans vos codes.

d'avance merci

Commentaire de coucou747 le 21/12/2005 09:48:59 administrateur CS

jonak, ma dèrnière source traite à peu près de ça : mise en page de sudoku...

$a=file_get_contents('monfichier');

le include est dangereux, car si l'autre page affiche du code php, alors ce code sera exécuté...

Commentaire de jonak le 21/12/2005 13:03:51

Merci coucou747,

voila comment je fait :
$texte=file_get_contents('monfichier');
$source = $texte ;
$pos = strpos($source, "<div class="XbcProfileTableContainer">") ;
$pos = ($pos +38) ;
$source_coupee = substr_replace($source, '', 0, $pos) ;
echo $source_coupee;

Malheureusement cela ne fonctionne pas. Le soucis viens du texte que je recherche qui contient des caratères inerpretté par PHP qui ferme la chaine avant la véritable fin  :
<div class="XbcProfileTableContainer">

Si je recherche que :
XbcProfileTableContainer

ca ne fonctionne pas quand même car il m'efface alors :
<div class="

Du coup cela coince quand je restitutue la variable avec le echo.

comment faire ?

Commentaire de coucou747 le 21/12/2005 14:53:52 administrateur CS

$source=file_get_contents('monfichier');
$source_coupee = substr($source, strpos($source, "<div class="XbcProfileTableContainer">"), 38) ;
echo $source_coupee;

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,654 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales