Pages :
Bonjour à tous, Je suis nouveau sur le Forum, comptable passionné d'investissement en bourse j'apprécierai un coup de pouce.

A partir d'une feuille Excel contenant des liens hypertextes en colonne A, je cherche à obtenir un renvoi automatique d'une information dans la page ouverte par ce lien hypertexte, toujours au même endroit.

Le lien ci dessous donne la liste des actions Françaises cotées en bourse via morningstar.fr

http://tools.morningstar.fr/fr/stockquickrank/default.aspx?Site=fr&LanguageId=fr-FR

je fais mon copier coller du listing sur excel et j'aimerais un renvoi de l'information caractéristiques -> Cours/actif net qui se situe en bas à droite de la fiche société ouverte par le lien hypertexte

Par exemple pour la première de la liste :
1000Mercis SA, je cherche le renvoi suivant Cours/actif net = 2.04.
4Service Cloud, la rien à renvoyer ( c'est une petite société et mornigstar n'a pas les infos)
A toute vitesse, pareil
A2micile, pareil
Ab science Cours/actif net = -34.70

Le volume pouvant atteindre presque 1400 sociétés à la fois, le fait de tout ouvrir manuellement n'arrange pas mes yeux ni mes migraines, c'est pourquoi vos idées m'intéressent.

Merci pour votre aide
Valentin
Salut,
moi de base je dirais que ca doit pouvoir se faire bien avec un petit script php.
Par contre leur navigation se fait en javascript du coup ça risque d’être un peu plus pénible...

Pour faire 'simple' (sans s'embeter a gerer le javascript) je verrais bien un petit formulaire html, dans lequel tu colles le code source de la page.
Le script php va chercher dans le code source tous les liens de type : hterf="../stockreport/default.aspx?id=...", et récupère le lien en entier.

Une fois que tu as l'ensemble des liens, le script php va récupérer le code source de chaque page et chercher "Cours/Actifs net" et si il trouve alors il récupère le contenu de la balise td suivante
Tant qu'ils ne changent pas de structure la page, ca devrait fonctionner Smiley smile
Slt mathieu

Merci beaucoup pour ta contribution, je vais approfondir ta piste, je te tiens au courant

Bonne soirée
Salut,
il y a sans doute encore un peu de boulot pour obtenir ce que tu veux, mais ca semble un bon debut Smiley smile

Ps1: je ne suis pas un expert en expression régulière donc il a peut être moyen de faire mieux, mais a priori cela devrait marcher
Ps2 : j'ai une erreur que j'attribue a wamp qui n'accede pas a internet, je pense que cela devrait marché si c'est bien configurer mais j'avais pas envie de perdre trop de temps à résoudre ce problème donc j'ai fais un petit arrangement perso pour vérifié la 2e expression régulière Smiley smile

Donc le fichier source.html contient le code source de la page fourni (réglé au préalable sur 500 pour avoir moins de passe a faire (sur firefox ctrl U ctrl A ctrl C, puis ctrl V dans le fichier source).
Dans le principe tu peux soit les faire a coup de 500, soit coller plusieurs code source de 500 les un a la suite des autres, cela devrait fonctionner aussi.

<?php
//on recupere tous les liens present sur la page qui commencent par ../stockreport...id=. Le ../ ne nous interesse pas donc on prends a partir de stockreport et jusqu'au guillement de fermeture exclus
preg_match_all("#href=\"\.\./(stockreport/default\.aspx\?id=.*?)\"#", file_get_contents("source.html"), $lien_relatif);
//var_dump($lien_relatif);

//exemple pour le premier lien, il faudra faire une boucle ici
$lien="http://tools.morningstar.fr/fr/".$lien_relatif[1][0];
//preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents($lien), $valeur); //bug sur cette ligne, je pense que mon wamp n'accede pas a internet lors de file_get_contents($lien)

//du coup je passe par un 2e fichier local pour la 2e expression reguliere
preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents("source2.html"), $valeur);
var_dump($valeur); //si il y a bien un Cours/Actifs net, alors la valeur sera dans $valeur[1][0] sinon la variable $valeur sera vide
?>

Modifié par mathieu1004 (01 Dec 2015 - 22:03)
Slt Mathieu,

Tu vas rire en me lisant car je débute totalement

J'ai commencé par installer Wampserver et Notepad++, j'apprends via des tutoriels pour comprendre les bases car je n'ai jamais touché à la programmation.

j'ai récupéré le code source avec Ctrl U + Ctrl A et copier coller dans mon Notepad++

Apres je ne sais pas trop où placer tes lignes de codes.. désolé pour mon niveau de base.

Pour le moment je m'instruis petit à petit sur la formule preg_match_all

Merci encore pour ton partage de compétences, si tu le souhaite je te parlerais des miennes en finance si toutefois ce domaine t'intéresse
Modifié par valentin1 (01 Dec 2015 - 21:20)
Ah ^^
il suffit de faire un clique droit sur un fichier puis open with notepad++ pour l'editer

Alors pour wamp : a coté de l'heure (ou petite flèche vers le haut) tu cliques sur le W vert, puis sur 'www directory'. Cela va t'ouvrir un fenêtre, Premier chose tu ouvre index.php avec notepad++ et a la ligne 30 tu remplace
$suppress_localhost = true;
par
$suppress_localhost = false;


Ensuite, a coté de intex.php, tu crées un dossier 'tests' (le nom que tu veux) puis dans le dossier tests, tu crée un fichier 'test.php'(idem nom que tu veux) dans lequel tu met le code que j'ai écris, puis tu crée un fichier 'source.html'(nom obligatoire, c'est celui que j'ai mis dans le code que je t'ai donné, si tu changes il faut changer dans le code) dans lequel tu copie le code source html de la page qui contient les 500 premiers liens.
Ensuite tu crées un fichier source2.html et tu y met le code source d'une page qui a bien "Cours/Actifs net" que tu veux.

Maintenant que les 3 fichiers sont crées, on va y accéder dans le navigateur web (firefox dans mon cas). Wamp va permettre d’exécuter le code php et de générer du html qui sera lisible par le navigateur web. Donc tu reclique sur le W vert a coté de l'heure puis cette fois tu cliques sur localhost, cela devrait t'ouvrir une page html avec le petit logo wampserver, en bas au milieu tu aura un truc vos projets, tu aura juste a cliqué sur 'tests' (ou autre si tu as changé le nom) puis sur 'test.php', normalement cela va exécuter le code que je t'ai fourni. et cela devrait afficher la valeur du cours/actifs net de la page que tu aura copié (c'est a titre de demo j'ai envie de dire ^^ )

J’espère être relativement clair, hésite pas a demander des précisions si tu bloque sur certains points

Une fois que tout cela fonctionnera, il faudra que je me penche sur le problème de connexion de wamp à internet que j'ai ... (pour remplacer le 'source2.html' par le source des les liens obtenus dans 'le source1.html' sinon ca limite fortement l’intérêt lol)
Éventuellement tu pourra test en décommentant le 2e preg_match_all et en commentant le 3e.

Au passage je fais 2 mini edit dans le code de la dernière fois, reprend le nouveau
Modifié par mathieu1004 (01 Dec 2015 - 22:04)
Tes explications sont impeccables

En ayant choisi la première société 1000 Mercis, en code du fichier source2

j'obtiens le résultat

array (size=2)
0 =>
array (size=1)
0 => string 'Cours/Actif net</th><td>2,08</td>' (length=33)
1 =>
array (size=1)
0 => string '2,08' (length=4)

Je sais pas si tu as le même résultat

Sais tu si il serai possible d'obtenir en plus le nom de la société concernée, sans vouloir abuser de ta gentillesse Smiley cligne
A priori le "2,08" corresponds au 'Cours/Actif net' que tu cherches à obtenir non ?

Pour le nom il faut faire une autre expression régulière du coup.
Dans le code source il y a qui contient le nom :
<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">1000Mercis SA</span> <span class="securitySymbol">ALMIL</span></h1></div>


Il faut le 'ALMIL' aussi ou juste '1000Mercis SA'?

Si il y a besoin des 2 :
preg_match_all('#<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">(.*?)</span> <span class="securitySymbol">(.*?)</span></h1></div>#', file_get_contents("source2.html"), $nom_societe);
var_dump($nom_societe);


Si il n'y a besoin que de '1000Mercis SA'
preg_match_all('#<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">(.*?)</span> <span class="securitySymbol">#', file_get_contents("source2.html"), $nom_societe);
var_dump($nom_societe);

Modifié par mathieu1004 (02 Dec 2015 - 11:42)
Slt,

Oui 2,08 est la bonne valeur.

Le nom de la société "1000Mercis SA" est suffisant, j'ai ajouté la ligne et ça fonctionne.

J'essaye de participer afin de trouver la solution du lien entre source1.html et source2.html, et ne pas te laisser tout faire .. malgré mon petit niveau

Je me renseigne sur des tutoriels mais je comprends pas tout.

Merci encore, c'est une application qui sera très utile
Ah bah ça roule c'est cool Smiley smile .

Est ce que tu as essayé de decommenter le 2e preg_match_all (celui qui est marqué comme ne fonctionnant pas pour moi) et de commenter le 3 (qui utilise le fichier 'source2.html' au lieu du lien) ?
Peut être que chez toi wamp à accès au net directement. Si cela marche tu devrait obtenir le même résultat avec le '2,08', si cela ne marche pas tu obtiendras une erreur.
Si cela ne marche pas je pense que je n'aurai pas le temps de régler ce problème d’accès internet avant ce weekend
Au sein de la ligne 11:

preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents("source2.html"), $valeur);

j'ai remplacé ("source2.html") par ($lien) si je me suis pas trompé dans ce que tu m'indique de faire

et il me met une erreur :

Warning: file_get_contents(http://tools.morningstar.fr/fr/stockreport/default.aspx?id=0P0000DKX2&amp;amp;SecurityToken=0P0000DKX2%5d3%5d0%5dE0EXG%24XPAR&amp;amp;ClientFund=0&amp;amp;LanguageId=fr-FR&amp;amp;CurrencyId=EUR&amp;amp;UniverseId=E0EXG%24XPAR&amp;amp;BaseCurrencyId=EUR): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\wamp\www\tests\test.php on line 11
Call Stack
# Time Memory Function Location
1 0.0004 133000 {main}( ) ..\test.php:0
2 0.0011 146168 file_get_contents ( ) ..\test.php:11
array (size=2)
0 =>
array (size=0)
empty
1 =>
array (size=0)
empty
Bon en cherchant rapidement sur le net pour l’accès au net (mais cela semble bon par defaut ...) :
Clique sur le W vert a coté de l'heure, PHP puis php.ini, cela ouvre un fichier texte.
Controle+F pour rechercher et tu tape : allow_url_fopen , cela devrait te mettre sur une ligne "allow_url_fopen = On" (par défaut sur On chez moi)

Je n'avais pas fait gaffe, mais je pense qu'il y a un problème d'encodage de l'url dans le lien crée (il y a des &amps; au lieu des & ...) . Est ce que l'erreur disparait si tu remplace le $lien par une valeur simple genre comme ça :


//$lien="http://tools.morningstar.fr/fr/".$lien_relatif[1][0];
$lien="http://www.google.fr"; 


Si l'erreur disparait, peut être qu'il suffit de faire :

$lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$lien_relatif[1][0]);
si par exemple j'écris ça je n'ai pas d'erreurs

<?php

preg_match_all("#href=\"\.\./(stockreport/default\.aspx\?id=.*?)\"#", file_get_contents("source.html"), $lien_relatif);

$lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$lien_relatif[1][0]);


preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents($lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$lien_relatif[1][0])), $valeur);
var_dump($valeur);

preg_match_all('#<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">(.*?)</span> <span class="securitySymbol">#', file_get_contents("source2.html"), $nom_societe);
var_dump($nom_societe);

?>
résultat

array (size=2)
0 =>
array (size=1)
0 => string 'Cours/Actif net</th><td>2,15</td>' (length=33)
1 =>
array (size=1)
0 => string '2,15' (length=4)
array (size=2)
0 =>
array (size=1)
0 => string '<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">1000Mercis SA</span> <span class="securitySymbol">' (length=122)
1 =>
array (size=1)
0 => string '1000Mercis SA' (length=13)
ah donc ce n'est pas un problème de connexion a internet, c’était le lien crée qui était foireux a cause des &amps;

Bon du coup petite remise du code au clair parce que tu as un peu trop remplacer le $lien..
<?php
//on récupère l'ensemble des liens dans le fichier source.html
preg_match_all("#href=\"\.\./(stockreport/default\.aspx\?id=.*?)\"#", file_get_contents("source.html"), $lien_relatif);

//on construit des liens complets a partir du tableau $liens_relatif[1]
$lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$liens_relatif[1][0]);

//a partir du lien on va chercher la valeur de Cours/Actifs net et on la met dans $valeur
preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents($lien), $valeur);
var_dump($valeur);

//ainsi que le nom de la société
preg_match_all('#<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">(.*?)</span> <span class="securitySymbol">#', file_get_contents($lien), $nom_societe);
var_dump($nom_societe);


Vu que la connexion a internet fonctionne, tu n'a plus besoin du fichier "source2.html".
Normalement cela doit te permettre de retrouver 1ere valeur de la 1ere société et le nom de la société.

Ensuite (i.e si ce code avant marche) il reste a compléter avec une boucle pour parcourir tous les liens, pas que le 1er, et rajouter une condition pour obtenir seulement ceux où il y a bien une valeur.



//on crée un tableau qui stockera les resultats
$results=array();

preg_match_all("#href=\"\.\./(stockreport/default\.aspx\?id=.*?)\"#", file_get_contents("source.html"), $liens_relatif);

//on fait une boucle pour parcourir tous les liens_relatif 
foreach ($liens_relatif[1] as $lien_relatif) {
    //a chaque tour de boucle on construit un nouveau lien.
    $lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$lien_relatif);
    //var_dump($lien);   

    //on essaye de recuperer la valeur
    preg_match_all("#Cours/Actif net</th><td>(.*?)</td>#", file_get_contents($lien), $valeur);
    //si il y a bien une valeur
    if(count($valeur[1])==1)
    {   //alors on recupere le nom de la societe
        preg_match_all('#<div id="SnapshotTitle" class="clearfix"><h1><span class="securityName">(.*?)</span> <span class="securitySymbol">#', file_get_contents("$lien"), $nom_societe);
        //var_dump($nom_societe);

        //et on stock le doublet (nom,valeur) dans notre tableau de resultat
        $results[]=array($nom_societe[1][0] , $valeur[1][0]);
        
    }//sinon on ne fait rien, on passe donc au tour de boucle suivant
}
//un dump de la variable pour vérifier que tu récupères bien tous les couples voulus 
var_dump($results);
//a la place du dump il reste à savoir quelle type de sortie des données tu veux obtenir pour traiter facilement les infos obtenues


Voila le code qui devrait te permettre de faire tous les liens (si je n'ai pas fais d'erreur), il ne reste plus qu'a gérer la façon dont tu veux récupérer les infos Smiley smile
Modifié par mathieu1004 (02 Dec 2015 - 22:21)
il me met un warning sur :

foreach ($liens_relatif[1] as $lien_relatif)

j'ai essayé d'ajouter un [0] après le [1] car il y avait la même chose plus haut mais c'est pas ça..

j'ai aussi remplacé le source2.html au sein de ton deuxième screenhot par $lien car on ne s'en sert plus.

Tu dois pas souvent aider tes empotés du binaire comme moi, faut tout me faire lol, en tous cas j'apprécie ton bon boulot c'est sympa

Bonne soirée
Ah quel con j'avais oublié le 1ere preg_match_all qui crée les liens_relatif ... c'est pour ca que tu avais un warning
Et bien vu pour le source2.html, c'est bien $lien qu'il fallait.

J'ai édité le message précédant, ça doit être bon maintenant je pense (j’espère ^^ )
ça fonctionne !!! t'as réussi

C'est super ton truc,

Il reste u petit détail : quand je dépasse 20 sociétés dans le copié collé sur le fichier source
Il me met Fatal error: Maximum execution time of 120 seconds exceeded

j'essaye de régler le fichier .ini de wampserver

à l'origine réglé sur 120 j'ai passé à 360 et 999 mais il met pareil. Maximum execution time of 120 seconds exceeded

C'est du bon boulot, tu te débrouille bien en php je cherchais ce résultat depuis longtemps
Hum question bete... apres avoir changé la valeur dans le fichier.ini tu as bien redémarrer wamp ? (W vert a coté de l'heure, 'Restart All services')
Par contre je ne pensais pas que ça prendrait autant de temps :s ça commence à faire long 2 minutes :x

EDIT :
Est ce que tu peux rajouter ça $i=0; et ensuite echo "<br>; echo$i++; dans le code pour que cela ressemble à ça ? Ensuite j'aurai besoin que tu me decrive la vitesse d'apparition des nombres a chaque lignes ( moi c'est instantané mais je suis toujours sur les fichiers locaux..)

$i=0;
//on fait une boucle pour parcourir tous les liens_relatif 
foreach ($liens_relatif[1] as $lien_relatif) {
    //a chaque tour de boucle on construit un nouveau lien.
    $lien= htmlspecialchars_decode("http://tools.morningstar.fr/fr/".$lien_relatif);
    //var_dump($lien);   

echo "<br>";   
echo $i++;

Modifié par mathieu1004 (02 Dec 2015 - 23:46)
Pages :