我正在从一个运行良好的网站上抓取一些 JSON 数据。我可以登录并下载必要的数据。但是,在一种情况下,我必须下载 HTML 页面才能从 HTML 中提取信息。
我修改了请求 header ,使其与使用 Chrome 开发人员选项 (F12) 可见的请求 header 相匹配。
Request request = new Request.Builder().url(url)
.header("Host", "www.host.com")
.header("Connection", "Keep-Alive")
.header("Cache-Control", "max-age=0")
.header("Upgrade-Insecure-Requests", "1")
.header("User-Agent",this.user_agent_user_for_this_session)
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
.header("Accept-Encoding", "gzip, deflate, br")
.header("Accept-Language", "en-US,en;q=0.9,fr;q=0.8,nl;q=0.7,de;q=0.6,af;q=0.5")
.get().build();
Response response = client.newCall(request).execute();
String html = IOUtils.toString(new GZIPInputStream(response.body().byteStream()));
我收到一个 HTML 文件,但它比从 Chrome 手动保存的 HTML 文件(源另存为)要小得多。我注意到 HTML 文件中存在各种 ng(角度)引用,这让我想知道我是否只收到了某个未完成的 javascript 过程的第一部分?
此外,下载的 HTML 看起来与 Chrome 第一个 WebView 中下载的 HTML 文件相同(我复制粘贴了内容,文件大小相同)。
那么我应该允许对请求进行一些额外的分析吗?
最佳答案
如果它是有角度的页面,那么你就不走运了 - 整个页面是在运行时生成的,所以实际的 index.html
有点小。
作为解决方法,我使用 Selenium 在 headless 浏览器中实际打开页面,并在初始化角度应用程序(也称为构建 DOM)后获取内容。
关于java - OkHttp3 抓取的 HTML 页面不完整,需要 JavaScript 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52302384/