Javascript 什么阻止HtmlUnit加载PSN存储页面?
我试图用HtmlUnit加载Playstation商店页面,但看起来它加载的所有内容都是带有“加载…”文本(和一点javascript)的空白页面。 我使用以下配置使HtmlUnit工作,但毫无希望(它的kotlin): 问题是:是什么阻止了HtmlUnit加载页面?我试着自己去想,但我唯一的想法是,这可能是对无头浏览器或HtmlUnit不支持的非常重的JS的某种防御。但例如 可以轻松打开。这称为SPA-。通常,SPA只有基本的标记、一个容器,整个UI是使用诸如或之类的框架动态呈现的 从中剥离脚本和样式后,剩下的是:Javascript 什么阻止HtmlUnit加载PSN存储页面?,javascript,java,web-scraping,kotlin,htmlunit,Javascript,Java,Web Scraping,Kotlin,Htmlunit,我试图用HtmlUnit加载Playstation商店页面,但看起来它加载的所有内容都是带有“加载…”文本(和一点javascript)的空白页面。 我使用以下配置使HtmlUnit工作,但毫无希望(它的kotlin): 问题是:是什么阻止了HtmlUnit加载页面?我试着自己去想,但我唯一的想法是,这可能是对无头浏览器或HtmlUnit不支持的非常重的JS的某种防御。但例如 可以轻松打开。这称为SPA-。通常,SPA只有基本的标记、一个容器,整个UI是使用诸如或之类的框架动态呈现的 从中剥离
<div id="waitAppLoading">
<div class="waitHorizon">
<div class="centerBox">
<div class="logoCtnr"></div>
<div class="textBox"><div class="spinCtnr"></div><div id="appLoadingMsg"></div></div>
<div class="startupErr"></div>
</div>
</div>
</div>
<div id="appRoot" class="hidden"></div>
<div id="lockdownScreen"></div>
<div id="global-wait">
<div class="waitHorizon">
<div class="waitContainer">
<div class="sq1"></div>
<div class="sq2"></div>
<div class="sq3"></div>
<div class="sq4"></div>
<div class="sq5"></div>
<div class="sq6"></div>
</div>
</div>
<div id="global-ps-loader">
</div>
</div>
<div id="notifierCtnr" class="mainCol"><div id="notifier-box"></div></div>
<div id="storeNotAvail"></div>
<div class="dimToolEl dimToolElProdTitle"></div>
<div class="dimToolEl dimToolElProdSubTitle"></div>
<div id="transact-iframe-container">
<iframe id="transact-iframe"></iframe>
</div>
如您所见,这里没有内容,只有应用程序的线框。web客户端不完全模拟浏览器,也不执行该脚本。这就是为什么您会看到一个空页面。至少这个java代码在这里工作。我得到了语言选择对话框,就像真实的FF一样。 我正在使用最新的HtmlUnit代码。总的来说,这是个好主意
String url = "https://store.playstation.com/";
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52)) {
final HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(1000 * 10);
System.out.println("----------------");
System.out.println(page.asText());
System.out.println("----------------");
HtmlElement btn = page.querySelector(".btn");
System.out.println(btn.asXml());
System.out.println("----------------");
}
请取消通话
waitForBackgroundJavaScript(10000)
waitForBackgroundJavaScriptStartingBefore(10000)
从您的设置代码。这些方法没有设置任何选项;他们在执行时等待 哦!!因此,应该调用这些方法,而不是Thread.sleep()。然后,可能这将有助于克服“加载”屏幕。我会试试的,谢谢你,我知道这是水疗。但是HtmlUnit可以处理JS请求,而且它实际上可以在一些SPA上工作。看起来我用了错误的方式等待JS执行
String url = "https://store.playstation.com/";
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52)) {
final HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(1000 * 10);
System.out.println("----------------");
System.out.println(page.asText());
System.out.println("----------------");
HtmlElement btn = page.querySelector(".btn");
System.out.println(btn.asXml());
System.out.println("----------------");
}
waitForBackgroundJavaScript(10000)
waitForBackgroundJavaScriptStartingBefore(10000)