如何重新加载Java InputStream

时间:2011-12-29 22:27:51

标签: java xml ajax

我正在使用围绕Java中的InputStream的BufferedReader解析网页:

HttpURLConnection conn = (HttpURLConnection)url.openConnection(myUrl);
InputStream stream = conn.getInputStream();

问题是我想从页面获取的数字是使用Ajax调用动态生成的,并且在流中不可用。有没有什么方法可以在等待一段时间后刷新流,或者有人能想到其他方式来获取数据吗?该页面为here。我需要的数字是页面中间的“Dollar Volume”和“Share Volume”。

谢谢, 贾里德

5 个答案:

答案 0 :(得分:4)

如果使用Ajax调用生成数字,那么您的代码需要进行这些Ajax调用。唯一类似于“刷新流”的是重新加载页面,如果它们通常由客户端上的Javascript通过单独的Web请求加载,那么仍然不会有数字。< / p>

只需找到Javascript发出的请求,并从您自己的代码中发出相同的请求。

(顺便说一句,你应该检查一下有问题的网站是否愿意像这样抓取他们的数据。)

答案 1 :(得分:2)

您可以检查页面上的JavaScript代码或使用网络嗅探器来确定JavaScript代码发送回服务器的HTTP请求,然后您可以用Java重现它们,而不是发送原始页面的请求。 / p>

实现这一目标的最可靠方法是找出它们是否提供了一些API。

答案 2 :(得分:2)

您需要对JavaScript进行逆向工程或使用浏览器扩展(即FireBug,IE开发人员工具等)或Web代理(如Fiddler)监控AJAX调用,以便确定:

  • AJAX调用的HTTP目标位置
  • AJAX调用的HTTP请求方法 - 即。 POST,GET
  • AJAX调用的结果 - 即。 XML,JSON,文本

获得AJAX结果后,您必须解析它以确定您的值。没有简单的方法可以做到这一点。我推荐Fiddler,因为你可以在请求之间看到原始和特殊格式的HTTP数据,甚至是AJAX,SSL等。

http://www.fiddler2.com/fiddler2/

http://www.getfirebug.com/

答案 3 :(得分:1)

您无法“刷新”流。协商由使用AJAX的客户端启动。客户端创建HTTP请求,服务器处理它。你有一个名为stream的数据访问抽象,可以读取它,直到流结束,当客户端完成发送数据或发生错误时发生。

因此,请阅读流,直到结束并解析内容。当客户端决定发送另一块数据时,它会创建新连接,并且您(在服务器端)获取新流。

答案 4 :(得分:1)

我打算在这里给出与其他人相同的答案,但在查看页面后,您正在寻找的具体数字不会被AJAX返回,而是在页面的实际HTML中返回。这是我抓住的一个例子:

<div id="marketTotals">
    <div class="panel">
        <strong>Dollar Volume</strong>
        <span class="value">79,567,751</span>

    </div>
    <div class="panel">
        <strong>Share Volume</strong>
        <span class="value">32,225,173</span>
    </div>
    <div class="panel">
        <strong>Trades</strong>

        <span class="value">6,413</span>
    </div>
    <div class="panel">
        <strong>Advancers</strong>
        <span class="value">60</span>
    </div>
    <div class="panel">

        <strong>Decliners</strong>
        <span class="value">120</span>
    </div>
</div>

没有特殊的编码来获取这些 - 特别是没有重新加载流。您甚至可以通过使用curl或wget来查看这些内容。

所有这一切,请确保您在尝试以这种方式筛选可能的专有数据之前获得网站所有者的许可 - 或者在您意识到自己正在玩“猫”之前不久和鼠标游戏“有障碍和解决方法。同意其他建议 - 如果允许和支持,他们可能会有一个更稳定的API,他们可以为您提供这样做。