1. #1
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut Récupérer le source d'une page web

    Bonjour,
    J'essaie de récupérer le source d'une page web, avec un webbrowser (Visual Studio 2013).

    J'ai donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String^ contenu = this->webBrowser1->DocumentText;
    Mais ça ne récupère qu'un morceau de ma page, et au debug, je ne peux visualiser qu'en lecture .txt

    Les autres modes me disent que les balises ne sont pas fermées, ou refusent de lire quoi que ce soit.

    Je suppose qu'il faudrait peut-être un tableau de String^, plutôt qu'un String^ ?

    Merci pour votre aide.
    Le C++/CLI rajoute une couche...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 312
    Points : 37 596
    Points
    37 596

    Par défaut

    Je ne saurais pas trop dire, personnellement je passerais plutôt par une HttpWebRequest que par un WebBrowser... À moins qu'il y ait des histoires de Javascript modifiant le DOM. Auquel cas, cette question sur SO pourrait t'aider.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Je me suis mal exprimé au 1é post : ma page test s'affiche correctement dans le webBrowser.
    En revanche, je ne peux récupérer que environ le quart du code source de la page, dans une String^.

    A l'exec, le programme me dit que "la valeur de la propriété "$" est null ou non définie, pas un objet Function", 2 fois à la même ligne.

    Code: 0

    Puis le prog me dit que "l'objet ne gère pas la propriété ou la méthode "reduce".

    Toujours Code: 0

    Dans le String^, j'aurai récupéré le source de la page jusqu'à la ligne de l'erreur propriété "$" est null ou non définie.


    J'ai essayé une bidouille avec un httpWebRequest.

    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
     
     
    			String^ PATH = "file:///C:/C++/test/ressources/page_test.htm";
    			WebRequest^ Request = WebRequest::Create(PATH);
    			HttpWebResponse^ Response = dynamic_cast<HttpWebResponse^>(Request->GetResponse());
     
    			Request->Credentials = CredentialCache::DefaultCredentials;
    			Response = dynamic_cast<HttpWebResponse^>(Request->GetResponse());
    			Stream^ Stream1 = Response->GetResponseStream();
    			StreamReader^ SReader = gcnew StreamReader(Stream1);
    			String^ Responsestring = SReader->ReadToEnd();
     
    			SReader->Close();
    			Stream1->Close();
    			Response->Close();

    Ce code génère à l'exec l'erreur "An unhandled exception of type 'System.NullReferenceException' occured in Project1.exe

    Additionnal information: La référence d'objet n'est pas définie à une instance d'un objet.

    Je suis en train d'essayer d'installer libcurl, mais c'est tout sauf simple, ce machin, pour celui qui bidouille une fois tous les 6 mois ...

    Merci d'avance pour tout éclairage.
    C'est quand même bizarre que le webBrowser puisse afficher la page, mais soit infoutu de récupérer son code source !!!

  4. #4
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 187
    Points : 8 936
    Points
    8 936

    Par défaut

    Je ne comprends pas votre démarche.

    Si c'est pour comprendre pourquoi il y a des erreurs JavaScript, bin, faut déboguer le JavaScript, pas faire une usine à gaz pour récupérer le code de la page Web.

    Des outils dans le navigateur (F12 pour IE) ou à part comme Fiddler2 permettent de facilement voir le contenu des fichiers chargées par le navigateur, qui sont largement plus nombreux que la page web elle-même.

    Ce code génère à l'exec l'erreur "An unhandled exception of type 'System.NullReferenceException' occured in Project1.exe
    Bin, pourquoi n'utilisez-vous pas tout simplement le débogueur pour savoir d'où ça vient ?
    Mais, bon, je pense que ce code est totalement inutile si vous prenez les outils adéquate, je pense.

    P.S.: votre code est très étrange (Webrequest sur un "file:" ?,2 GetResponse ???) et peu sûr (la gestion des "Continue" status 100 de HTTP ?)

    Je suis en train d'essayer d'installer libcurl, mais c'est tout sauf simple, ce machin, pour celui qui bidouille une fois tous les 6 mois ...
    Si vous pouvez basculer sur une code libcurl, autant utiliser des outils dédiées et pas réinventer la roue (et un client HTTP, c'est une putain de roue cosmique).

    C'est quand même bizarre que le webBrowser puisse afficher la page, mais soit infoutu de récupérer son code source !!!
    Le WebBrowser, c'est juste un wrapper autour d'un composant COM "Navigateur" et il faut bien plus qu'un simple fichier "htm" pour afficher une page de nos jours (les .css, les IFRAME, les .scripts, <IMG>, les <OBJECT>, etc...)
    Le chargement d'une "page web", c'est très souvent plusieurs dizaines de fichiers téléchargés, très souvent avec des pages qui s'incluent dans d'autres pages qui s'incluent dans d'autres etc...
    Une page qui contient des IFRAME qui contient des scripts => le code n'est pas dans le "code source" de la page mais dans le code source d'une page script "incluse" d'une page HTML (l'IFRAME) qui est "incluse" dans la page initiale.

    Donc, vous prenez pas la tête à refaire une roue et utilisez des outils adaptés.

  5. #5
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Merci d'avoir pris le temps de me répondre.

    Citation Envoyé par bacelar Voir le message
    Je ne comprends pas votre démarche.

    Si c'est pour comprendre pourquoi il y a des erreurs JavaScript, bin, faut déboguer le JavaScript, pas faire une usine à gaz pour récupérer le code de la page Web.
    Les erreurs javascript de la page, ça m'est égal. C'est un extrait du texte de la page qui m'intéresse, sachant que des pages comme ça, il y en aura 200 ou 300 à charger et à exploiter (donc, CTRL+U de firefox, on oublie).

    Citation Envoyé par bacelar Voir le message
    votre code est très étrange (Webrequest sur un "file:" ?,2 GetResponse ???) et peu sûr (la gestion des "Continue" status 100 de HTTP ?)
    C'est un code que j'ai récupéré sur un forum (stackoverflow, ou similaire), donné par google + C++ + httpwebrequest + get page
    Je ne me suis pas posé de questions.

    Citation Envoyé par bacelar Voir le message
    Le chargement d'une "page web", c'est très souvent plusieurs dizaines de fichiers téléchargés, très souvent avec des pages qui s'incluent dans d'autres pages qui s'incluent dans d'autres etc...
    Effectivement, il manque pleins d'images et autres jolis boutons, sur la page chargée dans le webBrowser, mais j'ai l'essentiel dans le webB : le texte de la page.

    Or, ce texte, il en manque les 3/4dans ma String^.

    L'idée de récupérer libcurl, pareil : google.

    Je me dis naïvement que si le texte qui m'intéresse s'affiche dans le webBrowser, c'est que la page source html est déchiffrée au moins correctement jusqu'à ce stade.

    Je suis d'accord, pour l'invention de la roue et de l'eau chaude.
    Les outils dédiés, j'ai probablement pas fait la bonne recherche avec google, mais je suis preneur d'une piste ...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 312
    Points : 37 596
    Points
    37 596

    Par défaut

    Ton problème, c'est qu'une partie du contenu de la page peut avoir en fait été généré côté client par le javascript. Et un code qui ne récupère que la source HTML initiale n'aura pas ça.

    Edit: D'ailleurs, une bonne expérience peut être d'ouvrir ledit site avec le javascript désactivé. Si tu as firefox, l'extension QuickJava permet d'activer/désactiver javascript (et pas mal d'autres choses) en un clic.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Je viens d'installer quickjava.

    J'ai décliqué le java et le javascript.

    J'ai mis sur off, à la ligne Initial load.

    Le site se charge nickel, la page source aussi ....

  8. #8
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 187
    Points : 8 936
    Points
    8 936

    Par défaut

    Il n'y a pas que les JavaScripts qui peuvent influencer le contenu du source de la page et sa disponibilité :
    IFRAME, le status HTTP 100, etc...

    Un "HttpWebResponse", c'est quand même largement plus basique qu'un navigateur complet.

    Pouvez-vous nous donner une URL accessible de l'extérieur pour charger la page dans nos navigateurs et ainsi voir les particularités, voir nous donnez une trace de chargement via Fiddler ?

    C'est quoi la finalité du biniou ? faire du Web scrapping ?

  9. #9
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    je veux récupère le texte de cette page.
    http://www.lueur.org/bible/lire/genese1/segond-strong
    puis de celles ci
    http://www.lueur.org/bible/hebreu-grec/strong/h7225
    avec 1 <= h <= 8674
    Pour créer un dictionnaire version - thème, et un outil qui me fera réviser le dico (interrogation avec des critères de rareté d'un mot, en fonction résultats des interros précédentes, etc...)

    Encore merci pour le temps que vous prenez à me répondre.
    Je suis aller voir le source de HtTrack, mais le source n'est quasi pas documenté avec des commentaires, et ça a tout de l'usine à gaz.

  10. #10
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 187
    Points : 8 936
    Points
    8 936

    Par défaut

    Ça ressemble quand même beaucoup à du Web scrapping, qui n'est pas forcement autorisé par les chargés du site.
    Vérifiez que vous restez dans la légalité, et si les chargés du site sont ouverts, ils devraient déjà mettre à disposition un WebService, plus facile à utiliser pour les programmes.

    En utilisant un sniffer réseau (Wireshark), le flux de la réponse n'a pas de grande originalité, quand j'utilise un vieux IE8 (j'ai que ça sous la main).

    A vérifier avec votre "WebRequest", que le serveur Web ne fasse pas des "excentricités", en utilisant un sniffer réseau.

    Le code que vous avez donné plante parce que vous ne faites pas une requête HTTP, car vous utilisez un protocole "file:" et non "http:".

    Pour vos tests, utilisez directement une URL "http:".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String^ PATH = "http://www.lueur.org/bible/lire/genese1/segond-strong";
    WebRequest^ Request = WebRequest::Create(PATH);
    HttpWebResponse^ Response = dynamic_cast<HttpWebResponse^>(Request->GetResponse());
    Stream^ Stream1 = Response->GetResponseStream();
    StreamReader^ SReader = gcnew StreamReader(Stream1);
    String^ Responsestring = SReader->ReadToEnd();
     
    SReader->Close();
    Stream1->Close();
    Response->Close();

  11. #11
    Futur Membre du Club
    Inscrit en
    juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    J'avais pourtant testé, avec le site endirect, ça doit être le Credential qui me mettait aussi le bazar.

    Là, ça marche nickel, merci beaucoup pour ton aide.

Discussions similaires

  1. [iOS] Récupérer le code source d'une page web
    Par aliasc dans le forum Objective-C
    Réponses: 6
    Dernier message: 12/01/2011, 12h03
  2. Récupérer le code source d'une page web
    Par hassine dans le forum C#
    Réponses: 6
    Dernier message: 08/11/2010, 11h46
  3. Récupérer la source d'une page web
    Par Pooch dans le forum C#
    Réponses: 5
    Dernier message: 13/08/2010, 21h52
  4. Réponses: 0
    Dernier message: 09/01/2010, 23h07
  5. Récupérer le code source d'une page web
    Par glRaZ dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/12/2004, 09h16

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