当前位置: 首页 > 知识库问答 >
问题:

Http URLConnection等待内部请求

乐正育
2023-03-14

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

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

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

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

共有1个答案

须新
2023-03-14

从您的“inner requests”注释来看,网站似乎正在使用JavaScript(通过框架或仅使用本机浏览器API)来获取数据并将这些结果呈现到DOM中。这在现在的水疗中心等很常见。

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

为了在代码中正确地做到这一点,您需要一些能够更像浏览器的东西,并且能够在类似DOM的环境中执行HTML引用的JS。尝试Selenium与PhantomJS或headless Chrome/Firefox,或者GhostDriver。

 类似资料:
  • 我需要把所有的结果推入一个数组,使异步超文本传输协议调用,但我需要等到所有的调用都完成。 这里只有等待这个选项吗?我害怕使用它,因为等待每个请求会减慢整个过程。

  • 问题内容: 我正在尝试编写一个JS代码,如果给定的数字已经存在于数据库中,它将取消“ btn_submit”按钮.onclick事件。我使用AJAX向数据库查询给定的编号,并确定是否应将数据发送到将上传问题的.php站点。为了确定这一点,我需要numOfRows变量的值,但是因为我在AJAX中将其设置为0,所以validation()函数将在我的AJAX查询完成之前完成,这将导致始终表示给定数字不

  • 问题内容: 我正在使用hiredis C库连接到redis服务器。我无法弄清楚订阅新消息后如何等待新消息。 我的代码如下所示: 现在如何告诉hiredis在频道上等待消息? 问题答案: 您无需告诉hiredis您需要在通道上等待:事件循环将仅在先前已注册的Redis连接上等待。 这是一个完整的示例: 您可以通过使用以下命令发布内容来对其进行测试: event_base_dispatch函数是实际启

  • Verticle部署是异步的,可能部署完成后才返回。 如果你想要部署完成后通知,您可以部署指定完成处理程序: vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", res -> { if (res.succeeded()) { System.out.println("Deployment id is: " + re

  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 问题内容: 目前,我正在编写使用ajax进行搜索的webdriver测试。如果在键入搜索内容之后并按Enter键之前添加显式等待,则测试效果很好。 但 失败。我正在使用1个虚拟CPU在ec2上运行测试。我怀疑,即使在发送与搜索相关的GET请求之前,我也按回车键;如果在建议之前按回车键,它将失败。 有没有更好的方法来添加显式等待? 问题答案: 您确实可以添加一个明确的等待,以等待诸如 请参阅:htt