htmlUnit - возможно ли выполнять только определенные функции JS? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть проблема - я пытаюсь почистить веб-страницу Cinema, ---> https://cinemaxx.dk/koebenhavn

Мне нужно получить данные о том, сколько мест зарезервировано / продано, мне нужно извлечьпоследний снимок.

Зарезервированные / проданные места показаны на рисунке красным квадратом:

enter image description here

В основном,моя логика такова.

  1. Я очищаю контакт, используя htmlUnit.
  2. Я установил htmlUnit для выполнения всех JS.
  3. извлекать (stringSseats BASE64 String).
  4. Конвертировать строку BASE64 в изображение.
  5. Затем моя программа проанализирует изображение и посчитает, сколько мест зарезервировано / продано.

    • Моя проблема:

По мере необходимостипоследний снимок изображения, - потому что это изображение, которое дает правильные данные, связанные с тем, сколько мест зарезервировано / продано.- Я начинаю очистку веб-сайта за 3 минуты до начала фильма, ... и до ввода == ноль.

Я делаю это по циклу, используя мой метод очистки - Но сервер ciname автоматически резервирует 2 места при каждом запросе (и держи их 10 минут).- В итоге я зарезервировал все места в полном кинотеатре ... (вы можете увидеть пример с 2 зарезервированными местами (синие квадраты) на картинке выше).

Я нашел метод JS вHTML-код, который зарезервировал 2 места по запросу. Теперь я бы хотел, чтобы htmlUnit выполнил все JS, чтобы использовать этот JS-метод, который резервирует эти 2 места по HTTP-запросу., все выше.

Есть ли кто-то, кто может привести меня в правильном направлении?, или, возможно, имел аналогичную проблему?.

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();
    }
}

1 Ответ

0 голосов
/ 22 мая 2019

Один из вариантов, который у вас есть, - перехватывать и изменять ответы сервера и заменять вызов функции чем-то другим.

  • заменять только имя функции (это ужасно, поскольку во время выполнения генерируются исключения js)или
  • удалить вызов функции из источника или
  • заменить тело функции на {} или
  • ....

См. http://htmlunit.sourceforge.net/faq.html#HowToModifyRequestOrResponse для более

...