IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

file_get_contents : récupérer le contenu d'une page internet


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut file_get_contents : récupérer le contenu d'une page internet
    Bonjour,

    Inscrire le <script src="https://services.data.shom.fr/hdm/vignette/grande/PORNIC?locale=fr"></script> sur une page internet, permet de générer un vignette faite par le site Shom.
    Quand on regarde la page https://services.data.shom.fr/hdm/vi...RNIC?locale=fr, elle affiche le code javascript qui permet de générer la vignette.

    Jusqu'à il y a 3 jours, je récupérais ce texte grâce à file_get_contents() et j'en faisais mon affaire (oui, ce n'est pas dans les conditions générales mais mon usage est restreint et sans aucun objet commercial).
    Aujourd'hui ça ne fonctionne plus. au bout 1 ou 2 minutes, file_get_contents() renvoie false.

    Z'avez vous pourquoi ? et sauriez vous me dire comment récupérer à nouveau le texte ?


    J'ai essayé de modifier le context ... sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	$options = array(
    		'http' => array(
    			'method' => "GET",
    			'user_agent' => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0"
    		)
    	);
    	$contexte = stream_context_create($options);
    	$auxdata = file_get_contents("https://services.data.shom.fr/hdm/vignette/grande/".$ville."?locale=fr", false, $contexte);
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 269
    Points : 8 568
    Points
    8 568
    Billets dans le blog
    17
    Par défaut
    De mon coté, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $options = array(
    'http' => array(
    'method' => "GET",
    'user_agent' => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0"
    )
    );
    $contexte = stream_context_create($options);
    $ville = 'PORNIC';
    $auxdata = file_get_contents("https://services.data.shom.fr/hdm/vignette/grande/".$ville."?locale=fr", false, $contexte);
    print_r($auxdata);
    Et cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $ville = 'PORNIC';
    $auxdata = file_get_contents("https://services.data.shom.fr/hdm/vignette/grande/{$ville}?locale=fr");
    print_r($auxdata);
    Donnent immédiatement un résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var rid="vignette_shom_"+Math.round(Math.random()*10000000);
    document.write("<iframe width='675' id='"+rid+"' height='900' frameborder='0' scrolling='no'></iframe>");
    var ifrm = document.getElementById(rid);
    ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
    ifrm.document.open();
    ifrm.document.write('<!DOCTYPE html>');
    ifrm.document.write('<html>');
    ifrm.document.write('<head>');
    ....
    Affiche les erreurs et/ou vérifie ton log d'erreurs.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse.

    Citation Envoyé par Séb. Voir le message
    Et cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $ville = 'PORNIC';
    $auxdata = file_get_contents("https://services.data.shom.fr/hdm/vignette/grande/{$ville}?locale=fr");
    print_r($auxdata);
    C'est globalement ce que je faisais et ça fonctionnait jusqu'il y a 3 jours.
    J'ai refait le test à l'instant avec ces 4 lignes .... au bout de 2 minutes, il s'affiche une page vide.

    Citation Envoyé par Séb. Voir le message
    Affiche les erreurs et/ou vérifie ton log d'erreurs.
    Je ne crois pas avoir accès au log d'erreur de mon hébergeur externe.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Je viens d'installer easyphp chez moi.
    La page se charge correctement grâce à file_get_contents.
    Je suis perplexe sur l'origine du problème : le site chez mon hébergeur serait blacklisté ? le chargement de la page a fonctionné un gros mois.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    J'ai testé via un autre nom de domaine au sein du même hébergeur et ça donne le même résultat.
    Le fait d'être en php 7.4 serait-il un problème ? une option à paramétrer ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Vous pourriez essayer de pomper cette page avec le module Curl par exemple. Comme cela vous auriez le status code et éventuellement un message d'erreur. Je n'ai pas regardé, mais ça ressemble à une API et ne serais pas étonnée qu'il y ait du rate limiting. SI vous faites trop de requêtes, vous pourriez être bloqué pendant un certain temps. Mais avec cette fonction vous n'avez aucune visibilité.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Je ne connais pas cURL. J'ai tenté ceci mais ça ne marche pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://services.data.shom.fr/hdm/vignette/grande/PORNIC?locale=fr");
    curl_setopt($ch, CURLOPT_HTTPGET, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $auxdata = curl_exec($ch);
    curl_close($ch);	
    echo $auxdata."<br>";

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Je ne m'attendais pas à ce que ça fonctionne c'est juste pour avoir plus de lisibilité en récupérant le status code et éventuellement un message d'erreur.
    CURLOPT_POST peut être retiré car vous faites une requête GET, pas POST. CURLOPT_HTTPGET n'est pas nécessaire non plus. Par défaut, c'est une requête GET qui est faite.

    Ceci dit, il est parfaitement possible que le service consulté soit défaillant, ou contrarie les robots (réels ou supposés), c'est bien pour cette raison que consulter le status code est un minimum quand on consomme une API.

Discussions similaires

  1. Récupérer le contenu d'une page internet
    Par Invité dans le forum Langage
    Réponses: 14
    Dernier message: 09/06/2021, 19h26
  2. Réponses: 3
    Dernier message: 20/05/2015, 20h54
  3. Récupérer du texte d'une page internet
    Par PorkyFighter dans le forum C
    Réponses: 2
    Dernier message: 11/11/2006, 22h55
  4. Récupérer le contenu d'une page PHP
    Par Pragmateek dans le forum Réseau
    Réponses: 37
    Dernier message: 28/05/2006, 23h00
  5. [Servlet]Récupérer le contenu d'une page web
    Par Jarodnet dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/10/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo