1

yop,

Je cherche à récupérer des données sur des pages web. Concrètement, ce style de page : http://steamcommunity.com/market/search?q=M4A4+%7C+Espace+d%C3%A9sol%C3%A9

Ce qui m'intéresse : les prix.

J'ai téléchargé la page, on les trouve dans le fichier htm. J'ai l'impression qu'il suffit de faire de la recherche de string, c'est bête comme choux.
Je compte faire ça en C++, dans un programme avec une UI Qt.
L'idée, ça serait d'utiliser un programme externe genre wget pour télécharger la page, puis d'extraire le prix (à moins que Qt sache télécharger une page).

Quelques petites questions :
- en vrai, quand on est pas un gros porc inculte en web, on fait comment ?
- n'y a-t-il pas moyen de récupérer que le fichier htm, et non les 65428682 images qui vont avec ?

Merci d'avance pour vos conseils. smile

bon ok, vous avez la permission de rigoler en grand et de bien vous foutre de moi embarrassed

2

On peut faire exactement comme tu décris, avec deux petits changements liés à tes deux questions :

- Un fichier HTML ressemble à un document XML (d'ailleurs dans certains cas c'est un document XML), c'est à dire qu'il a une structure arborescente dans laquelle tu peux naviguer. C'est plus fiable que faire des recherches de strings (moins de risques de faux positifs, puisqu'en plus d'indiquer un motif tu peux indiquer à quel endroit dans l'arbre tu t'attends à le trouver), mais en pratique ta solution peut être suffisante s'il n'y a aucune ambiguïté sur ce que tu veux rechercher. Au cas où ça t'intéresse, tu peux regarder ce que tu trouves en cherchant "HTML DOM parser" sur ton Google préféré smile

- Bien sûr, c'est même plus simple que de récupérer les images. Tu as du utiliser wget, qui simule un navigateur web et s'occupe de télécharger une page complète avec tout son contenu, au lieu de simplement prendre le code HTML. Essaie avec curl par exemple, ça devrait se rapprocher davantage de ce que tu cherches.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Merci !!! smile

4

Tu peux essayer directement dans ton shell :
curl -s -H 'Accept-Language: fr' 'http://steamcommunity.com/market/search?q=M4A4+|+Espace+d%C3%A9sol%C3%A9' | sed -nr 's@.*<span class="normal_price">([^<>]*)</span>.*@\1@p'Le -H 'Accept-Language: fr' sert à se faire passer pour un navigateur configuré en français, vu que visiblement la recherche en dépend (on obtient aucun résultat sinon).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Folco (./1) :
bon ok, vous avez la permission de rigoler en grand et de bien vous foutre de moi embarrassed
c'est vrai, c'est vrai ? grin

Folco (./1) :
L'idée, ça serait d'utiliser un programme externe genre wget pour télécharger la page, puis d'extraire le prix (à moins que Qt sache télécharger une page).
wget est une bonne solution si tu es paresseux, sinon ça m'étonnerait beaucoup que personne n'ait déjà développé ça avec Qt (si ce n'est pas supporté de base) smile

Folco (./1) :
- n'y a-t-il pas moyen de récupérer que le fichier htm, et non les 65428682 images qui vont avec ?
Si tu demandes à wget (ou Qt) de te récupérer la page HTML, il ne va te récupérer que la page HTML. C'est ton navigateur qui prend l’initiative de récupérer les autres éléments quand tu enregistres la page (d'ailleurs, avec Firefox, tu peux choisir dans la boîte de dialogue d'enregistrement "Page HTML complète" qui récupère tout, ou "Page HTML seulement" qui ne récupère que le fichier HTML).

Folco (./1) :
- en vrai, quand on est pas un gros porc inculte en web, on fait comment ?
J'imagine qu'ils n'ont pas d'API dédiée pour récupérer leurs données (ça serait trop facile) ?
Cherche "web scraping C++", ça devrait te donner des pistes. Par exemple : http://stackoverflow.com/questions/834768/options-for-web-scraping-c-version-only
Après, pas sûr que ça vaille le coup de sortir une usine à gaz comme ça si une expression régulière, voire une recherche de chaîne suffit pour ton cas grin

(edit : cross, cette fois-ci c'est Zeph qui a posté en premier grin)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

6

Deux fois même, c'est ma revanche ! grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

hehe
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

8

Évidemment que Qt sait récupérer une page web.

Exemple (c'est un fichier YAML dans ce cas, mais ça marche exactement pareil pour du HTML):
https://github.com/calamares/calamares/blob/master/src/modules/netinstall/NetInstallPage.cpp#L100
https://github.com/calamares/calamares/blob/master/src/modules/netinstall/NetInstallPage.cpp#L75
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Yep, c'est en français effectivement. J'ai pas cherché à utiliser la version américaine de steam, mais ça n'a pas d'importance.

Merci bien pour les commandes, je connais pas du tout curl. Et sed me fait peur rien qu'à lire le nom grin

Sinon, j'étais en train de regarder ça : http://doc.qt.io/qt-5/qwebenginepage.html
Peut-être Kevin pourra-t-il me dire si c'est la bonne classe pour récupérer la page et la lire ? cheeky
Je cherche encore de ce côté hehe

10

Bon ben merci Kevin, alors ça serait plus QNetworkRequest alors, on va voir ça ^^

11

QWebEnginePage, c'est pour afficher la page web. Pour récupérer le HTML et scanner directement sa source, c'est totalement overkill, ça te fait une dépendance de la QtWebEngine (donc toute l'usine à gaz Chromium) et aussi de QtWidgets. Ce que tu cherches est bien QNetworkRequest.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

Parfait, merci.
J'aurai QtWidgets de toute façon, je compte utiliser ça dans une UI Qt. smile

Merci à tous ! smile

13

Sinon, tu as cherché du côté des API ?
Par exemple, on peut facilement obtenir ceci avec l'identifiant du produit :
http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=M4A4%20%7C%20Desolate%20Space%20%28Well-Worn%29
avatar

14

Oh non, comment fait-on ça ? Evidemment, c'est complètement ce que je cherche !

15

On lit la documentation grin
avatar

16

Le tout est de la trouver, cette documentation ^^
Bon, premier résultat de google pour steam market api : http://stackoverflow.com/questions/26170185/steam-market-api
On va voir de ce côté smile

edit -> https://steamapis.com/developers
Par contre, ils parlent de clé à acquérir, je vais quand même patauger un peu pour comprendre tout ça. Mais tout à l'air d'être là ! smile

17

Folco (./12) :
Parfait, merci.
J'aurai QtWidgets de toute façon, je compte utiliser ça dans une UI Qt. smile
Mais pas QtWebEngine (qui est énorme et qui n'est pas disponible partout (notamment pas sous MinGW, parce que Chromium ne compile pour Windows qu'avec Visual C++)), probablement. smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

https://steamapis.com/
Bon, ok. Faut utiliser une clé secrète pour faire les requêtes. Ca permet de savoir combien il faut payer. C'était trop beau. ><

RHJPP -> tu l'as trouvée où, ta documentation stp ? Je vois plusieurs posts qui proposent des liens comme le tien, mais personne qui explique comment il a fait pour l'obtenir...

19

Ton lien n'est pas un truc officiel, je pense, le nom de domaine n'est pas le même que celui du lien de RHJPP.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

20

./18 > Je ne l'ai pas trouvé, je ne l'ai pas cherché. J'imaginais qu'il devait y en avoir une puisqu'il y a une API.
On trouve des listes de commandes, mais rien d'exhaustif... Le but est peut-être de créer un marché autour d'eux. Le site dont tu donnes le lien n'est par exemple pas un site officiel de Valve.
Il faut voir quels sont tes besoins. Les sites qui vendent des données ne font généralement pas payer pour les petits volumes.
avatar

21

flan -> je confirme, ça n'a rien d'officiel. Ils maintiennent juste une API stable, hébergent le service, et le font payer.

RHJPP -> le mystère s'épaissit. Les URLs valides se créent dans ta tête comem ça, par enchantement ? Par intuition ??
La liste des commandes, tu l'imagines, c'est tout, et ça colle ?
Et qu'appelles-tu un petit volume ? J'imagine que pour un usage perso, je serai toujours un petit volume, pas comme un site de vente de skin par exemple ?

22

Folco (./21) :
RHJPP -> le mystère s'épaissit. Les URLs valides se créent dans ta tête comem ça, par enchantement ? Par intuition ??
Par mimétisme, par identification des paramètres des liens qu'on trouve sur internet et par adaptation.
Le lien que je t'ai donné est un lien que j'ai trouvé sur un blog ou un forum et dans lequel j'ai mis l'identifiant du premier produit que renvoie ta recherche. Si tu veux avoir les informations pour un autre produit, tu peux essayer de mettre l'identifiant de ce produit dans l'URL.

Ma réponse n'avait pas pour but de te donner la solution à ton problème, je répondais à cette question :
Folco (./1) :
Quelques petites questions :
- en vrai, quand on est pas un gros porc inculte en web, on fait comment ?
On cherche s'il existe une API qui fournit les données souhaitées.

Pour le prix en fonction du volume, il faut que tu regardes sur les sites qui proposent ces services. Il me semble que sur certains, en dessous de 500 requêtes par jour, ça pourrait être gratuit.
avatar

23

Moui. Pourquoi dépendre d'un service tiers quand on peut faire la même chose soi-même de manière simple ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

24

Il ne faut pas.
Déjà, il faut voir s'il y a des services officiels qui donnent ce qu'on cherche. Si ça n'existe pas, on peut regarder chez les tiers s'ils offrent des garanties de disponibilité et de pérennité de la fonctionnalité et que le prix demandé est acceptable (ici, il faut que ce soit gratuit). Une autre solution, c'est de le faire soi-même, mais il faut être conscient qu'il va sans doute être nécessaire de revenir régulièrement dessus pour s'adapter aux changements.
avatar

25

Bon, j'ai besoin d'aide, parce que je dois pas être très loin du compte, mais n'y connaissant rien en web, je sais pas ce que je fais de mal :
J'utiliser donc QNetworkAccess pour envoyer une [url=http://doc.qt.io/qt-5/qnetworkrequest.html[/url]QNetworkRequest[/url] et obtenir une QNetworkReply.

Mon code est simple : deux objets, une url. Un envoi, et j'attends une réponse. Mais ça veut pas embarrassed
    QNetworkAccessManager amanager;
    QNetworkRequest request;

            QUrl url = QString("http://steamcommunity.com/market/priceoverview/?currency=3&appid=730&market_hash_name=M4A4%20%7C%20Desolate%20Space%20%28Well-Worn%29");
            request.setUrl(url);
            QNetworkReply* reply = amanager.get(request);

            while (!reply->isFinished());
Ca doit être trop simple, parce que le programme freeze, rien ne se passe. Interrompre avec le débogueur m'envoie en plein milieu de code assembleur, sans aucune aide.

Merci d'avance pour votre aide happy


edit -> quand je regarde ça : http://doc.qt.io/qt-5/qtnetwork-http-httpwindow-cpp.html
mon truc n'a pas l'air trop déconnant (méthode startRequest vers le milieu de la page).

26

reply->isFinished() ne va pas pouvoir s'activer magiquement si tu ne fais pas tourner de boucle d'évènements. Et même si tu en faisais tourner une dans un autre thread, voire avec quelque chose comme QCoreApplication::processEvents() dans la boucle, attendre avec un busy-wait est une très mauvaise idée niveau performance, ça bouffe du CPU et donc du courant pour rien.

La solution la plus propre est de travailler en asynchrone avec le signal finished. Tu peux connecter un lambda C++11 à ce signal, ou alors, si tu préfères, un bon vieux slot. Ensuite, tu retournes à la boucle d'évènements de l'application qui fera son travail et activera ton lambda ou slot au moment opportun.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

27

Kevin Kofler (./26) :
attendre avec un busy-wait est une très mauvaise idée niveau performance, ça bouffe du CPU et donc du courant pour rien.
Je pense qu'il le sait et qu'il utilise ça juste pour faire un test rapide, on parle de Folco quand même grin
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

28

Voilà, c'était juste pour valider l'utilisation des classes que je découvre. Fail retentissant ^^
Ceci dit, mon code différant à peine de l'exemple de la doc, c'est peut-être justre trop crade ^^ Je vais faire propre, et on verra à partir de là. smile

29

Si tu veux faire en super-crade, tu peux mettre:
while (!reply->isFinished()) QCoreApplication::processEvents();
Tu boufferas 100% CPU, mais ça devrait fonctionner.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

30

• Folco roule un e-patin à Kevin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

lovelovelovelovelovelovelovelovelovelove

Bon ben impec, plus qu'à mettre ça proprement dans une classe, dans une fenêtre à part même, putain ça va chier des bulles carrées, merci encore ! smile