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 :

Scraping, bloqué ?


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Scraping, bloqué ?
    Bonjour

    Je scrape le contenu d'un site "http://theexample.net/" il y'a une semaine maintenant, tout marchais à merveille. Mais aujourd'hui voulant faire la même tache je reçois une erreur.

    Je suis sure que mon script marche car quand je scrape du contenu de google ou d'un autre site çà marche.

    Voilà mon script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    include('simple_html_dom.php');
     
     
    $html = @file_get_html('http://theexample.net/');  
    if($html==FALSE) {
      echo 'error';
    } else {
      echo 'success';
    }
     
     
    // Find all links
    foreach($html->find('title') as $element)
    echo $element->innertext. '<br>';
     
    ?>
    Je reçois error pour "http://theexample.net/" et success pour les autres site.

    Voilà l'erreur Fatal error: Call to a member function find() on a non-object in C

    et si j'enlève le @ je recois une errreur en plus :Warning: file_get_contents(....: failed to open stream: No such file or directory in...

    Que devrais-je faire ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as contrôlé ce que valait $html et ce qui se passait dans file_get_html() ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    oui quand je mets https://www.google.com/ à la place de http://theexample.net/ çà marche.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Il est possible que suite à tes essais successifs le développeur du site:
    • ait banni l'IP ou le domaine de ton serveur, via une directive dans un .htaccess par exemple (vu que tu pratiques du scraping sauvage sans avoir l'autorisation du propriétaire du site.)
    • contrôle désormais le User Agent (qui dans ton cas ne correspond pas à un quelconque navigateur), ce qui peut se faire dans le code PHP même via la variable $_SERVER['HTTP_USER_AGENT'].
    • interdit l'accès aux pages de son site via fopen, file_get_contents, DOMDocument::loadHTMLFile et fort probablement file_get_html (*) en réglant l'option allow_url_fopen à 0 dans son php.ini (ou un truc équivalent s'il utilise un autre langage).


    Tu peux passer outre un filtre d'IP ou de domaine en passant par un serveur proxy (ou un service quelconque proposant une ip dynamique).

    Pour ce qui est du contrôle du User Agent, il peut être modifier facilement soit en définissant un contexte de flux pour les fonctions fopen, file et file_get_contents, soit en utilisant cURL pour récupérer la page (ça demande un peu d'investissement mais c'est bien plus performant). cURL permet également de passer outre allow_url_fopen.

    (*) Au passage, je ne saurais trop te déconseiller d'utiliser simple_html_dom qui n'est pas réputé pour sa vitesse (et qui selon moi n'est pas si simple que ça) en matière de parsing html. Autant sauter le pas pour se plonger dans DOMDocument et DOMXPath (qui, une fois appris sont utilisables dans n'importe quel langage à peu de frais).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    oui quand je mets https://www.google.com/ à la place de http://theexample.net/ çà marche.
    ça ne répond à aucune de mes questions.
    Le but c'est de disséquer ce qui se passe quand ça échoue.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Il est possible que suite à tes essais successifs le développeur du site:
    • ait banni l'IP ou le domaine de ton serveur, via une directive dans un .htaccess par exemple (vu que tu pratiques du scraping sauvage sans avoir l'autorisation du propriétaire du site.)
    • contrôle désormais le User Agent (qui dans ton cas ne correspond pas à un quelconque navigateur), ce qui peut se faire dans le code PHP même via la variable $_SERVER['HTTP_USER_AGENT'].
    • interdit l'accès aux pages de son site via fopen, file_get_contents, DOMDocument::loadHTMLFile et fort probablement file_get_html (*) en réglant l'option allow_url_fopen à 0 dans son php.ini (ou un truc équivalent s'il utilise un autre langage).


    Tu peux passer outre un filtre d'IP ou de domaine en passant par un serveur proxy (ou un service quelconque proposant une ip dynamique).

    Pour ce qui est du contrôle du User Agent, il peut être modifier facilement soit en définissant un contexte de flux pour les fonctions fopen, file et file_get_contents, soit en utilisant cURL pour récupérer la page (ça demande un peu d'investissement mais c'est bien plus performant). cURL permet également de passer outre allow_url_fopen.

    (*) Au passage, je ne saurais trop te déconseiller d'utiliser simple_html_dom qui n'est pas réputé pour sa vitesse (et qui selon moi n'est pas si simple que ça) en matière de parsing html. Autant sauter le pas pour se plonger dans DOMDocument et DOMXPath (qui, une fois appris sont utilisables dans n'importe quel langage à peu de frais).


    Je suis sure que mon ip n'a pas été blacklisté: je développe le site en local, j'ai une ip dynamique, j'ai redemarré ma box mon ip a changé, j'ai meme installé hotspot shield mais toujours le même problème.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Donc si je passe par domdocument et xpath je pourrais régler le problème ?

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Non, ça c'est juste un conseil pour le parsing du document. Dans un premier temps essai déjà de récupérer la page. (google: tutoriel php cURL me semble un bon point de départ.)

    Question bonus: As-tu vérifié que la page est toujours accessible via ton navigateur?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Non, ça c'est juste un conseil pour le parsing du document. Dans un premier temps essai déjà de récupérer la page. (google: tutoriel php cURL me semble un bon point de départ.)

    Question bonus: As-tu vérifié que la page est toujours accessible via ton navigateur?

    Oui j'ai verifié la page s'ouvre toujours dans mon navigateur.

    Donc je vais essayer de faire comme vous me dites m'investir dans Curl, Domdocument et xpath mais lequel choisir ?

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Août 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Août 2015
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je viens d'essayer avec cURL le même problème çà marche avec les autres sites mais pas avec mon site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://theexample.net/');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
    $return = curl_exec($curl);
    echo $return;
    ?>

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Il n'y a pas à "choisir". cURL permet le transfert de données vers ou à partir d'une URL, il n'intervient pas dans l'analyse du contenu reçu. DOMDocument n'intervient que dans un deuxième temps, pour l'analyse du html.

    DOMDocument est une classe dont les instances sont une représentation sous forme d'arbre d'un document HTML (ou XML). DOMDocument dispose de méthodes permettant "d'interroger" cette représentation arborescente pour trouver ce que l'on souhaite. Ces méthodes sont néanmoins basiques et parfois il est utile d'utiliser DOMXPath en complément de DOMDocument pour des demandes plus complexes, mais ça n'est pas forcément nécessaire.

    Comme je te l'ai dis dans un message précédant, commence d'abord par obtenir la page avec cURL. (J'entends par là créer un nouveau fichier php propre, genre testcurl.php et afficher le résultat de la session cURL avec un var_dump, et pas essayer de la coller dans un code de 200 lignes potentiellement bugué. Le but c'est d'avoir les idées claires sur ce qui se passe vraiment et de voir rapidement quand ça fonctionne ou pas, sans code parasite.)

    Pour bien comprendre les options de cURL, tu dois te renseigner sur ce qui est envoyé par le client (un navigateur) quand il demande une page (n'hésite pas à faire des recherches). Le but du jeu est de se faire passer pour un navigateur qui demande une page. Il existe des extensions pour Firefox qui permettent de récupérer ces échanges, par exemple header-spy. Comme ça en chargeant simplement la page dans ton navigateur et en comparant avec d'autres pages, par exemple celle qui "marchent", tu pourras te faire une idée de ce qui s'échange.

    cURL a plein d'options, notamment CURLOPT_USERAGENT qui permet au serveur d'identifier le User Agent. Tu trouveras ici une base de données qui te permettras de renseigner ce paramètre. Si ton url est en https, ajoute l'option CURLOPT_SSL_VERIFYPEER à false.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52
  2. Bloque la date et l'heure sous Win XP ??
    Par Djedjeridoo dans le forum Windows
    Réponses: 2
    Dernier message: 05/04/2004, 12h11
  3. Réponses: 2
    Dernier message: 23/03/2004, 12h23
  4. Réponses: 1
    Dernier message: 23/02/2004, 12h58
  5. bloqué en mode Release
    Par matsch77 dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 17h17

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