gpt4 book ai didi

java - htmlUnit - 是否可以只执行特定的 JS 函数?

转载 作者:行者123 更新时间:2023-12-02 05:21:52 26 4
gpt4 key购买 nike

我有一个问题 - 我正在尝试抓取电影院网页,---> https://cinemaxx.dk/koebenhavn

我需要获取有关预订/出售了多少座位的数据,我需要提取最后一个快照。

已预订/出售的座位如图中红色方 block 所示:

enter image description here

基本上,我的逻辑是这样的。

  1. 我使用 htmlUnit 抓取联系人。
  2. 我设置htmlUnit来执行所有JS。
  3. 提取(reservedSeats BASE64 字符串)。
  4. 将 BASE64 字符串转换为图像。
  5. 然后我的程序分析图像,并计算预订/出售的座位数量。

    • 我的问题是:

因为我需要图片的最后一个快照,-因为该图片提供了与预订/出售的座位数相关的正确数据。 - 我在电影开始前 3 分钟开始抓取网站,...直到输入 == null。

我通过循环抓取方法来做到这一点 - 但 ciname 服务器会在每个请求时自动保留 2 个席位(并保留 10 分钟)。 - 所以我最终保留了整个电影院的所有座位......(您可以在上图中看到 2 个保留座位(蓝色方 block )的示例)。

我在 HTML 中发现了按请求保留 2 个席位的 JS 方法 - 现在我希望 htmlUnit 执行除此通过 HTTP 请求保留这 2 个席位的 JS 方法之外的所有 JS。

  • 我希望以上这些都有意义。

  • 是否有人可以引导我朝正确的方向前进?或者可能遇到类似的问题?

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

最佳答案

您的一个选择是拦截并修改服务器响应并用其他内容替换函数调用。

  • 仅替换函数名称(这很难看,因为它会在运行时生成 js 异常)或
  • 从源中删除函数调用或
  • 将函数体替换为 {} 或
  • ...

参见http://htmlunit.sourceforge.net/faq.html#HowToModifyRequestOrResponse了解更多

关于java - htmlUnit - 是否可以只执行特定的 JS 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com