【问题标题】:Http URLConnection wait for inner requestHttp URLConnection 等待内部请求
【发布时间】:2019-01-08 07:23:57
【问题描述】:

我正在做一个爬行项目。当我对网站进行简单的URLConnection 连接时,如下所示:

URLConnection conn = new URL(url).openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

该方法正确返回 HTML 正文。但是,该网站对某些字段提出了内部请求。例如,网站从不同的 Web 服务获取用户总数。在网络浏览器中,用户总数会在一段时间后出现,但使用URLConnection 方法不会等待用户总数,返回的 HTML 不包含该字段。

在 Java 中,有没有办法等待一段时间以使用 URLConnection 从网站获取所有数据。

【问题讨论】:

    标签: java httpurlconnection urlconnection httpsurlconnection


    【解决方案1】:

    从您的“内部请求”评论看来,该网站正在使用 JavaScript(通过框架或仅使用本机浏览器 API)来获取数据并将这些结果呈现到 DOM。这在SPAs 等时很常见。

    如果是这样的话,再多的等待也不会改变使用像URLConnection 这样的简单 HTTP 库的结果 - 但您可以通过在本地保存 HTML 并在浏览器中查看来检查这一点 - 会发生什么?当您检查它时,该页面上是否有 JavaScript?

    要在代码中正确执行此操作,您需要能够表现得更像浏览器的东西,并在类似 DOM 的环境中执行 HTML 引用的 JS。试试SeleniumPhantomJS 或无头Chrome / Firefox,或者GhostDriver

    【讨论】:

    • 有趣的是,当我调试代码时,URLConnection 会返回完整的正文,但在运行时没有。
    【解决方案2】:

    如果网站不包含 Javascript,则使用 Java 的 Jsoup (https://jsoup.org) 库。它加载呈现最终 HTML 页面所需的所有内部 HTML 请求。

    【讨论】:

      【解决方案3】:

      通常,如果您要获取页面的 html 正文,则必须已完成在该网站的服务器端进行的所有调用。

      【讨论】:

      • 否则表示服务器仍在处理页面以进行 html 输出。
      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 2017-11-24
      • 2018-11-13
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多