在 HtmlUnit 中获取真正的 html 代码的问题

Posted

技术标签:

【中文标题】在 HtmlUnit 中获取真正的 html 代码的问题【英文标题】:Problem getting real html code in HtmlUnit 【发布时间】:2020-01-04 10:13:08 【问题描述】:

当我在浏览器中打开 https://www.instagram.com/metallica/ 并查看其源代码时,我看到包含“graphql”字段的 javascript 变量 window._sharedData

当我通过 htmlUnit 获取此页面时,变量 window._sharedData 不一样

有什么问题?如何使用 HtmlUnit 获得与浏览器中相同的 js 字段?

BrowserVersion my = new BrowserVersionBuilder(BrowserVersion.FIREFOX_52)
    .setUserAgent("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)").build();

WebClient webClient = new WebClient(my);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);

HtmlPage htmlPage = webClient.getPage("https://www.instagram.com/metallica/");
String pageContent = htmlPage.getWebResponse().getContentAsString();

UPD

浏览器中的window._sharedData: "config":"csrf_token":"zkBxaROkhJqxHV7QAYKvHYNU8QCP15vm","viewer":null,"viewerId":null,"country_code":"RU","language_code":"ru ","locale":"ru_RU","entry_data":"ProfilePage": window._sharedData 响应: "config":"csrf_token":"Rpm5P3Ok3ZUh7wVklBLPkMzw9k3u1tbz","viewer":null,"viewerId":null,"country_code":"RU","language_code":"en"," locale":"en_US","entry_data":"LoginAndSignupPage":

所以 LoginAndSignupPage 和 ProfilePage 的区别

UPD2

在我的服务器 instagram 上,由于未知原因将任何地址重定向到 /accouts/login,这就是内容不同的原因。那么现在的问题是如何防止这种重定向?

【问题讨论】:

可能值得使用 client.waitForBackgroundJavascript 并启用 Ajax 同步可能会帮助 client.setAjaxController(new NicelyResynchronizingAjaxController())。虽然我目前遇到一些 JS 重页的问题 @Gavin 没有帮助 【参考方案1】:

getWebResponse 返回您从服务器获得的响应。如果您想获取页面的当前状态,则必须等待页面中的 js 完成,然后使用 page.getEnclosureWindow().getEnclosedPage().asXML();

如果您与真正的浏览器进行比较,请确保

浏览器没有存储 cookie,因为 HtmlUnit 总是以空的 cookie 存储开始

为 HtmlUnit 启用 JavaScript

【讨论】:

这个解决方案没有帮助:(

以上是关于在 HtmlUnit 中获取真正的 html 代码的问题的主要内容,如果未能解决你的问题,请参考以下文章

用htmlunit怎么去获取一个有JS加载的网页信息

Groovy htmlunit getByXPath

HtmlUnit---网页抓取工具解析及使用

防止 HtmlUnit 2.13 执行 JavaScript

利用htmlunit登陆带验证码图片的网站

Java HtmlUnit 单击锚链接不起作用。如何获取新页面?