WebHU - Programozási kérdések és válaszok

htmlUnit - Lehetséges csak meghatározott JS-függvények végrehajtása?

Problémám van – egy mozi weboldalt próbálok lekaparni ---> https://cinemaxx.dk/koebenhavn

Adatokat kell szereznem a lefoglalt/eladott helyek számáról, ki kell bontanom az utolsó pillanatképet.

A lefoglalt/eladott helyek a képen piros négyzetként láthatók:

adja meg itt a kép leírását

Alapvetően ez a logikám.

  1. A névjegyet a htmlUnit segítségével lekaparom.
  2. Beállítottam a htmlUnit-ot az összes JS végrehajtására.
  3. bontsa ki a (reservedSeats BASE64 String) karakterláncot.
  4. Alakítsa át a BASE64 karakterláncot képpé.
  5. Ezután a programom elemzi a képet, és megszámolja, hogy hány helyet foglalt/eladott.

    • My issue is:

Mivel szükségem van a kép utolsó pillanatképére, mert ez a kép adja meg a helyes adatot a lefoglalt/eladott helyek számáról. - 3 perccel a film kezdete előtt elkezdem kaparni a weboldalt,... és addig, amíg input == null.

Ezt úgy teszem, hogy hurkolom a scrape metódusomat - De a moziszerver minden kérésre automatikusan lefoglal 2 helyet (és megtartja 10 percig). - Szóval végül lefoglalom az összes helyet a moziban... (a fenti képen a 2 lefoglalt ülőhelyen (kék négyzetek) láthat egy példát).

Megtaláltam a JS metódust a HTML-ben, amely lefoglalta a 2 helyet kérésre - Most szeretném, ha a htmlUnit végrehajtaná az összes JS-t, és ezt az egy JS metódust hajtsa végre, amely HTTP kéréssel lefoglalja ezt a 2 helyet.

  • Remélem értelmet ad a fentieknek.

  • Van valaki, aki esetleg a megfelelő irányba tud vezetni?, vagy esetleg volt hasonló problémája?.

public void scraper(String url) {

    final String URL = url;

    //Initialize Ghost Browser (FireFox_60):
    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {

        //Configure Ghost Browser:
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);

        //Load Url & Configure Ghost Browser:
        final HtmlPage page = webClient.getPage(URL);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.waitForBackgroundJavaScript(3000);


        //Spider JS PATH to BASE64 data:
        final HtmlElement seatPictureRaw = page.querySelector
                ("body > div.page.page--booking.ng-scope > div.relative > div.inner__container.inner__container--content " +
                        "> div.seatselect > div > div > div > div:nth-child(2) > div.seatselect__image > img");

        //Terminate Current web session:
        webClient.getCurrentWindow().getJobManager().removeAllJobs();
        webClient.close();


        //Process the raw BASE64 Data - Extract clean BASE64 String:
        String rawBASE64Data = String.valueOf(seatPictureRaw);
        String[] arrOfStr = rawBASE64Data.split("(?<=> 0\") ");
        String cleanedUpBASE64Data = arrOfStr[1];
        String cleanedUpBASE64Data1 = cleanedUpBASE64Data.replace("src=\"data:image/gif;base64,", "");
        String cleanedUpBASE64Data2 = cleanedUpBASE64Data1.replace("\">]", "");
        //System.out.println(cleanedUpBASE64Data2);


        //Decode BASE64 Rawdata to Image:
        final byte[] decodedBytes = Base64.getDecoder().decode(cleanedUpBASE64Data2);
        System.out.println("Numbers Of Caracters in BASE64 String: " + decodedBytes.length);
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(decodedBytes));

        //Forward image for PictureAnalyzer Class...
        final PictureAnalyzer pictureAnalyzer = new PictureAnalyzer();
        pictureAnalyzer.analyzePixels(image);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

  • Ez nem egy Flash alkalmazás? 22.05.2019
  • @Teemu - ööö, mire gondolsz pontosan? az oldal ? 22.05.2019
  • engedélyeznie kell a javascriptet a grafika eléréséhez – igaz? 22.05.2019
  • Kérjük, először tisztítsa meg a kódot; érdemes konfigurálni az ügyfelet, mielőtt bármi mást tenne – helyezze át az összes webClient.getOptions() utasítást a tetejére 22.05.2019
  • általában webClient.setAjaxController(new NicelyResynchronizingAjaxController()); nem kötelező tényleg szüksége van erre? 22.05.2019
  • A későbbiekben mélyebben megvizsgáljuk kérdését 22.05.2019
  • @RBRi - Ebben az esetben be kell töltenem a javascriptet, mivel a lemásolandó kép egy adott JS végrehajtása után töltődik be. *Kód törölve, köszönöm. 22.05.2019

Válaszok:


1

Az egyik lehetőség az, hogy elfogja és módosítja a szerver válaszait, és lecseréli a függvényhívást valami másra.

  • csak a függvény nevét cserélje ki (ez csúnya, mert futás közben js kivételeket generál) vagy
  • távolítsa el a függvényhívást a forrásból, ill
  • cserélje ki a függvény törzsét {}-ra vagy
  • ....

További információért lásd: http://htmlunit.sourceforge.net/faq.html#HowToModifyRequestOrResponse

22.05.2019
  • Nem tudom, mit értesz noop alatt?. 22.05.2019
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..