在 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 代码的问题的主要内容,如果未能解决你的问题,请参考以下文章