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:
Alapvetően ez a logikám.
- A névjegyet a htmlUnit segítségével lekaparom.
- Beállítottam a htmlUnit-ot az összes JS végrehajtására.
- bontsa ki a (reservedSeats BASE64 String) karakterláncot.
- Alakítsa át a BASE64 karakterláncot képpé.
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();
}
}