[R] Récupérer le contenu d'une page web qui se complète via JavaScript

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

[R] Récupérer le contenu d'une page web qui se complète via JavaScript

#1

Message par keving »

Bonjour,

J'essaie de récupérer une ligne bien précise sur cette page de l'Epic Games Store: https://www.epicgames.com/store/en-US/f ... lang=en-US

J'arrive à récupérer cette information avec un tout petit peu de JavaScript:

Code : Tout sélectionner

// Nom du jeu
document.querySelector(':scope div[data-component="DiscoverContainerDesktop"] span[data-component="OfferTitleInfo"] span[data-component="Message"]').parentElement.previousSibling.innerText

// Jusqu'à quand?
document.querySelector(':scope div[data-component="DiscoverContainerDesktop"] span[data-component="OfferTitleInfo"] span[data-component="Message"]').firstChild.nextSibling.dateTime
Donc je me suis dit, pourquoi ne pas le transformer en un script AutoIt et avoir une petite popup qui me prévient quand il y a un nouveau jeu gratuit à l'affiche.

Code : Tout sélectionner

#include <Inet.au3>
Local $sURL = "https://www.epicgames.com/store/en-US/free-games"
Local $sResult = _INetGetSource($sURL)
ConsoleWrite($sResult)
; Parser le résultat...
Mais en essayant de récupérer le contenu de la page je me suis vite rendu compte qu'il y avait un petit problème, ce que je récupère via _INetGetSource est avant la fin du chargement de la page (via React), donc les informations ne sont pas encore chargées:
Image
Je me suis dit que j'allais essayer en passant par cette solution, mais rien de concluant vu que cette page ne supporte pas IE...
Image


J'ai cherché des cas similaires, mais les réponses ne fonctionnent pas pour moi:
  • _IEDocReadHTML
  • _INetGetSource
  • InetRead
  • CURL

Existe-t-il une autre solution pour récupérer le contenu de ce genre de page générées via des librairies JavaScript (React, Vue, Angular, ...)?
Modifié en dernier par keving le ven. 04 juin 2021 09:04, modifié 1 fois.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Récupérer le contenu d'une page web qui se complète via JavaScript

#2

Message par walkson »

Bonjour,
Pour récupérer une page Web

Code : Tout sélectionner

$adress = "https://www.epicgames.com/store/en-US/free-games?lang=en-US"
$aa =InetGet($adress,"adresse.html",16)
ConsoleWrite($aa & @CRLF)
Si j'ai bien compris, pour récupérer les jeux free

Code : Tout sélectionner

#include <IE.au3>
#include <Array.au3>
Local $oIE = _IECreate("https://www.epicgames.com/store/en-US/free-games?lang=en-US")
Local $oLinks = _IELinkGetCollection($oIE)
Local $array[0][2]
Local $sTxt
For $oLink In $oLinks
	$sTxt &= $oLink.innertext &"|"& $oLink.href & @CRLF

Next
_ArrayAdd($array,$sTxt)
_ArrayDisplay($array,"tous les liens")
Local $jeufree
For $i = 0 To UBound($array) - 1
	If $array[$i][0] = "Free" Then
	$jeufree &= $array[$i][1] & @CRLF
	EndIf
Next
MsgBox(0,"",$jeufree)
_IEQuit($oIE)


Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Récupérer le contenu d'une page web qui se complète via JavaScript

#3

Message par keving »

C'est presque ça ;)
Je me suis un petit peu mal expliqué, celui que je cherche de jeu gratuit c'est celui qui est tout en haut, et celui-là apparait avec du retard sur la page... et n'apparait même pas quand j'ouvre avec IE.

Là le premier jeu gratuit remonté, ligne 82 c'est Fortnite, qui se trouve dans le bloc des jeux gratuits en bas de la page.
Image



Celui que je veux récupérer c'est le jeu gratuit maintenant (qui se trouve entre "PLAY MORE" & "Epic Coupons are back"), pour en récupérer le nom & jusqu'à quand il est gratuit.
Image



Mais le problème c'est qu'il ne se charge pas dans IE ce bloc...
Image



Donc le lien du bouton bleu "FREE NOW" n'est pas trouvé :/
Image

#include <IE.au3>
#include <Array.au3>
Local $oIE = _IECreate("https://www.epicgames.com/store/en-US/free-games?lang=en-US")
Local $oLinks = _IELinkGetCollection($oIE)
Local $array[0][2]
Local $sTxt
For $oLink In $oLinks
   $sTxt &= $oLink.innertext & "|" & $oLink.href & @CRLF
Next
_ArrayAdd($array, $sTxt)
_ArrayDisplay($array, "tous les liens")
Local $jeufree
For $i = 0 To UBound($array) - 1
   If $array[$i][0] = "Free Now" Then
      $jeufree &= $array[$i][1] & @CRLF
   EndIf
Next
MsgBox(0, "", $jeufree)
_IEQuit($oIE)



Je pense que je vais essayer de passer par cette solution via Edge pour ne pas être pollué par mes extensions en tout genre... Enfin, il ne me reste qu'à comprendre comment marche son sélecteur...
Avatar du membre
keving
Niveau 1
Niveau 1
Messages : 11
Enregistré le : mar. 01 juin 2021 16:00
Status : Hors ligne

Re: [..] Récupérer le contenu d'une page web qui se complète via JavaScript  

#4

Message par keving »

Je confirme que c'était bien cette solution là :)

Image

;~ WebDriver UDF (W3C compliant version) - 04/28/2021
;~ https://www.autoitscript.com/forum/topic/191990-webdriver-udf-w3c-compliant-version-04282021/
#include "UDF/wd_core.au3"
#include "UDF/wd_helper.au3"

Local $sDesiredCapabilities, $sSession

$_WD_DEBUG = $_WD_DEBUG_Info

__SetupEdge()
_WD_Startup()
$sSession = _WD_CreateSession($sDesiredCapabilities)

If @error = $_WD_ERROR_Success Then
   ConsoleWrite("+Running: __FindFreeNow" & @CRLF)
   __FindFreeNow()
   ConsoleWrite("+Finished: __FindFreeNow" & @CRLF)
EndIf

;~ MsgBox($MB_ICONINFORMATION, "Complete!", "Click ok to shutdown the browser and console")

_WD_DeleteSession($sSession)
_WD_Shutdown()

Func __FindFreeNow()
   Local $sElement, $aOutput[1][2]

   _WD_Navigate($sSession, "https://www.epicgames.com/store/en-US/free-games?lang=en-US")

;~    Locate title for the Temporary Free Game
   $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//span[@data-component='OfferTitleInfo']")
   $aOutput[0][0] = _WD_ElementAction($sSession, $sElement, 'Text')

;~    Finding time:  Free Now - (Time)
   $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//span[@data-component='OfferTitleInfo']/span[@data-component='Message']/time")
   $aOutput[0][1] = _WD_ElementAction($sSession, $sElement, 'Attribute', 'datetime')

   _ArrayDisplay($aOutput)
EndFunc   ;==>__FindFreeNow

Func __SetupEdge()
;~    _WD_Option('Driver', 'msedgedriver.exe')
   _WD_Option('Driver', 'D:\Users\kevin\Documents\GitHub\AutoIt-Launcher\scripts\UDF\msedgedriver.exe')
   _WD_Option('Port', 9515)
   _WD_Option('DriverParams', '--verbose --log-path="' & @ScriptDir & '\msedge.log"')

   $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"ms:edgeOptions": {"binary": "' & StringReplace(@ProgramFilesDir, "\", "/") & '/Microsoft/Edge/Application/msedge.exe", "excludeSwitches": [ "enable-automation"], "useAutomationExtension": false}}}}'
EndFunc   ;==>__SetupEdge
Répondre