Page 1 sur 1

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

Posté : jeu. 03 juin 2021 12:05
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, ...)?

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

Posté : jeu. 03 juin 2021 14:42
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)



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

Posté : jeu. 03 juin 2021 15:33
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...

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

Posté : ven. 04 juin 2021 09:04
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