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

Delphi Discussion :

Récupérer le code source d'une page Internet/Intranet


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Récupérer le code source d'une page Internet/Intranet
    Bonjour,

    je sais..
    cette question a déjà été débattue, mais les solutions proposées ne fonctionnent pas chez moi..
    déjà, avec FF 38.4.0, sur clic-doit, le code est modifié par rapport à l'origine..
    seule une partie du Header s'affiche mais pas le Body
    sur IE11, c'est mieux, le code s'affiche complet sans modif.

    mais, pas moyen de le récupérer et ce n'est pas faute de ne pas avoir essayé :
    après avoir testé une bonne dizaines d'astuces (TWebbrower, TEmbeddedWB, IHTMLDocument2, IHTMLDocument3, Indy, TDocument, Stream, FAQ etc.)
    ben, rien quedal !


    svp merci de me donner une petite bouffée d'oxygène

    avez-vous quelque chose qui marche ?

    cantador

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Merci de ne pas mettre le titre en majuscule, pas la peine de hurler.

    la méthode sale mais rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //un mémo et un idhttp sur la fiche
    memo.lines.add(idhttp.get(<adresse>));
    un petit peu plus propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var aStream : TMemoryStream;
    begin
    aStream:=TMemoryStream.Create;
    try
     IdHTTP1.Get(''http://www.developpez.net/forums/f15/environnements-developpement/delphi/',aStream);
     aStream.Position:=0;
     memo1.Lines.LoadFromStream(AStream);
    finally
      aStream.Free;
    end;
    bien que rien de cela ne marche (car ni jambes ni pattes) cela fonctionne
    reste à coder : l'attente, la gestion des erreurs et l'encodage
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Cela dépend aussi de la complexité de la page
    Si c'est une page HTML généré à partir du Serveur Web, oui c'est possible

    Maintenant si la page d'origine ne contient qu'un petit bout de HTML faisant appel à un JQuery qui monte la page bloc par bloc totalement dynamiquement par une suite d'échange AJAX/JSON,
    difficile d'avoir le HTML final par un simple GET HTTP, il te faut absolument l'execution du JS et je crois que le TWebbrower me plantait souvent les JS alors que IE lui passait sans soucis

    Je parle d'expérience car j'ai participé à un projet Web, où le serveur remontait QUE du JSON, aussi bien la donnée (même structure qu'un TClientDataSet, ben oui, c'est moi qui a codé la 1ère version du serveur Web en PHP) que la présentation et le workflow,
    tout était ensuite transformé par un tas de JS et en utilisant la YahooLib (ça c'était mon collègue, qui s'éclatait en JS, depuis il est même passé à AngularJS et Node.js côté serveur)
    Au final, pas un bout de HTML sortait du GET, tout était généré par le Navigateur sur le poste du client
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @SergioMaster
    le registre pro te va mieux que celui de l'humour..

    @ShaiLeTroll
    tes remarques pertinentes m'ont donné du grain à moudre et du coup,
    je dois revoir ma partition.

    la suite au prochain numéro

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut suite..
    dans le code de la page, il y a un lien PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    src="Annuaire.php"
    de ce fait le Get ne me renvoie pas le code..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function GetHTML(MyWebB: TWebBrowser): string;
    var
      MyIHTML: IHTMLElement;
    begin
      Result := '';
      if Assigned(MyWebB.Document) then
      begin
        MyIHTML := (MyWebB.Document as IHTMLDocument2).Body;
        while MyIHTML.parentElement <> nil do
          MyIHTML := MyIHTML.parentElement;
        Result := MyIHTML.outerHTML;
      end;
    end;
    mais, si j'affiche le code source de la page, j'ai tout à l'écran.
    il faudrait peut-être coder un copier coller de la page.
    avez une solution pour effectuer cette opération ?

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut suite
    Bonjour à tous,

    n’ayant pas été gâté par les aides sur cette question, j’ai donc pas mal cogité..
    tout d’abord, j’ai choisi le TEmbeddedWB, plus stable que le TwebBrowser ou le TMozillaBrowser.

    Après avoir testé des choses compliquées et bien galéré, je suis revenu à du code plus simple.

    j’ai donc en fait besoin d’effectuer un simple copier coller des éléments d’une page WEB
    dont le source ne peut pas être récupéré par des méthodes classiques.

    Voici mon code qui fonctionne mais en deux temps seulement:

    - chargement de la page
    - extraction des données

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    unit MainForm;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      OleCtrls, ActiveX, SHDocVw_EWB, EwbCore, EmbeddedWB, ClipBrd, StdCtrls;
     
    type
      THTMLForm = class(TForm)
        Memo: TMemo;
        EmbeddedWB1: TEmbeddedWB;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormCreate(Sender: TObject);
     
      private
        function GetStrFromClipbrd: string;
        procedure ConvertCSV;
        procedure ExtractPhoneBook;
        procedure LoadHtml(URL: string);
      end;
     
    var
      HTMLForm: THTMLForm;
      SL: TStringList;
     
    const
      URLSite = 'MonSite.php';
     
    implementation
     
    {$R *.DFM}
     
    procedure THTMLForm.LoadHtml(URL: string);
    begin
      EmbeddedWB1.Navigate(URL);
    end;
     
    function THTMLForm.GetStrFromClipbrd: string;
    begin
      if Clipboard.HasFormat(CF_TEXT) then
        Result := Clipboard.AsText
      else
      begin
        ShowMessage('pas de texte dans le presse papier !');
        Result := '';
      end;
    end;
     
    procedure THTMLForm.Button2Click(Sender: TObject);
    var
      vInput, vOutput: OleVariant;
      str: string;
      Cpt: TPoint;
      i: integer;
    begin
      Cpt := Point(EmbeddedWB1.Width div 2 - 20, EmbeddedWB1.Height div 220); 
      Cpt := EmbeddedWB1.ClientToScreen(Cpt);
      SetCursorPos(Cpt.X, Cpt.Y);  {position curseur}
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);   {clic On}
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);          {clic Off}
     
      Application.ProcessMessages;      {nécessaire pour propager la sélection}
      EmbeddedWB1.ExecWB(OLECMDID_SELECTALL, 0, vInput, vOutput);   {copier coller}
      EmbeddedWB1.ExecWB(OLECMDID_COPY, 0, vInput, vOutput);
      Memo.Lines.Text := GetStrFromClipbrd;           {stockage dans Memo}
     
      for i := 0 to Memo.Lines.Count - 1 do    {conversion en CSV}
      begin
        Str := Memo.Lines.Strings[i];
        str := StringReplace(str, '    ', ';', [rfReplaceAll]);
        Memo.Lines.Strings[i] := Str;
      end;
     
      Memo.Lines.SaveToFile('Annuaire.csv');    {sauvegarde pour tester le fichier}
     
    //  ConvertCSV;     {traitement futur pour extraire les données}
    end;
     
    procedure THTMLForm.FormShow(Sender: TObject);
    begin
    // pas de possibilité d'enchaîner les opérations..
    end;
     
    procedure THTMLForm.FormCreate(Sender: TObject);
    begin
      LoadHtml(URLSite);
    end;
     
    initialization
      OleInitialize(nil);
     
    finalization
      OleUninitialize;
     
    end.

    Voilà où j’en suis, mais ce fonctionnement en deux temps ne m’arrange pas, car j’ai un gros traitement des données à réaliser afin de pouvoir les exploiter.

    j’ai bien tenté aussi de placer un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    repeat
    until EmbeddedWB1.ReadyState = READYSTATE_COMPLET*;
    mais le TEmbeddedWB ne comprend pas l’instruction...
    Le code reste à 1, soit en, chargement et le programme boucle.


    Bref, un conseil de votre part me serait bien utile afin de pouvoir enchaîner les deux opérations.

    merci par avance

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut aie !
    je viens de voir que cette solution est intéressante pour effectuer juste une extraction
    mais pour en faire une application ce n'est pas bon du tout,
    car cela oblige de maintenir l'affichage de la page Web au démarrage du programme,
    page que l'on ne peut bien sûr pas cacher..

    il faut trouver autre chose

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut une solution..
    une modification du code me permet d'enchaîner les deux opérations et de rendre invisible
    le Browser juste après le clic :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    procedure THTMLForm.Button2Click(Sender: TObject);
    var
      vInput, vOutput: OleVariant;
      str: string;
      Cpt: TPoint;
      i: integer;
    begin
      LoadHtml(URLSite);
    // boucle d'attente..
      while EmbeddedWB1.ReadyState < READYSTATE_INTERACTIVE do
        Application.ProcessMessages;
      EmbeddedWB1.SetFocus;
      if EmbeddedWB1.Focused then
      begin
        Cpt := Point(EmbeddedWB1.Width div 2 - 20, EmbeddedWB1.Height div 2 - 20);
        Cpt := EmbeddedWB1.ClientToScreen(Cpt);
        SetCursorPos(Cpt.X, Cpt.Y);
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        Application.ProcessMessages;
      end;
      EmbeddedWB1.Visible := false;
      EmbeddedWB1.ExecWB(OLECMDID_SELECTALL, 0, vInput, vOutput);
      EmbeddedWB1.ExecWB(OLECMDID_COPY, 0, vInput, vOutput);
      Memo.Lines.Text := GetStrFromClipbrd;
      for i := 0 to Memo.Lines.Count - 1 do
      begin
        Str := Memo.Lines.Strings[i];
        str := StringReplace(str, '    ', ';', [rfReplaceAll]);
        Memo.Lines.Strings[i] := Str;
      end;
      Memo.Lines.SaveToFile('Annuaire.csv');
    end;
    mais ça reste tiré par les cheveux et quand même pas terrible.
    difficile de faire une appli avec un truc pareil..

    dans l'attente de vos commentaires..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le code source d'une page HTML
    Par phyn04 dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 24/11/2016, 14h45
  2. <mx:html> Récupérer le code source d'une page
    Par Nanard_ dans le forum Flex
    Réponses: 0
    Dernier message: 15/01/2009, 09h35
  3. Récupérer le code source d'une page Internet
    Par sango85 dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/11/2008, 09h02
  4. Récupérer le code source d'une page distante
    Par audran12 dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2008, 22h23
  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