为什么 InputStreamReader 返回的内容与浏览器不同?

Why is InputStreamReader returning different content than browser?

如果你在浏览器中输入这个url:

https://charlotte.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&AUCTIONDATE=07/16/2019

它returns很多数据。但是,如果我尝试使用 Input StreamReader 捕获该数据,返回的唯一数据是

{"retHTML":"", "rlist":""}

程序如下:

List<Property> scrapePropertyInfo(List<Date> auctionDates) {
    List<Property> properties = new ArrayList<>();
    String urlStr = "https://charlotte.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&AUCTIONDATE=07/16/2019";
    String str = null;
    try {
        URL url = new URL(urlStr);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        StringBuilder stringBuilder = new StringBuilder();
        while ((str = in.readLine()) != null) {
            stringBuilder.append(str);
        }
        System.out.println("Url: "+urlStr);
        System.out.println(stringBuilder.toString());
        in.close();
    } catch (MalformedURLException ex) {
        Logger.getLogger(CharlotteCtyFL.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(CharlotteCtyFL.class.getName()).log(Level.SEVERE, null, ex);
    }
    return properties;
}

有人知道为什么吗?

编辑:现在更聪明了 所以显然需要将更多的东西发送到服务器,而不仅仅是 url。由于这是动态 ajax 数据,只有当您使用原始网页要求它很好时才会填充数据,因此需要在 java 中模拟它。

我发现了如何在 chrome F12 调试器控制台中获取该信息。在 Network->XHR->Preview 下,单击每个项目,直到看到预期的数据。然后 right-click 就可以了 select Copy->Copy Request Headers.

这是复制的内容:

GET /index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&tx=1563231065712&bypassPage=1&test=1&_=1563231065712 HTTP/1.1 Host: charlotte.realforeclose.com Connection: keep-alive Accept: application/json, text/javascript, /; q=0.01 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Origin: http://evil.com/ Referer: https://charlotte.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=PREVIEW&AUCTIONDATE=07/16/2019 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Cookie: cfid=6f228aa1-bb7e-4734-92ff-39eabf23ed9b; cftoken=0; CF_CLIENT_CHARLOTTE_REALFORECLOSE_TC=1563229207612; AWSELB=E7779D5F1C1F6ABE3513A5C5B6B0C754520B66675A407900314ABAC5333A52E93FD1A8D7401D89BC8D5E8B98059C8AAC5507D12A2C6ED07F7E7CB77311BD7FB09B738DB945; _ga=GA1.2.1823487290.1563231012; _gid=GA1.2.1418453663.1563231012; _gat=1; _gcl_au=1.1.273755450.1563231013; __utma=65865852.1823487290.1563231012.1563231014.1563231014.1; __utmc=65865852; __utmz=65865852.1563231014.1.1.utmcsr=realauction.com|utmccn=(referral)|utmcmd=referral|utmcct=/client-sites; __utmt_UA-51657054-1=1; __utmb=65865852.2.10.1563231014; testcookiesenabled=enabled; CF_CLIENT_CHARLOTTE_REALFORECLOSE_LV=1563231067363; CF_CLIENT_CHARLOTTE_REALFORECLOSE_HC=73

现在如何将其添加到 java 的请求中?我知道如何在 java 脚本中执行此操作,但不知道 java.

尝试 运行 这个 – 它会获取 url 并显示输出:

curl "https://charlotte.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&AUCTIONDATE=07/16/2019"

所以您看到的行为不是 Java 正在(或未)做的事情。

我怀疑远程服务器正在查看入站 HTTP 请求并决定要 return 的内容。在您的 Java 代码中,与这个简单的 curl 示例一样,没有浏览器 headers、用户代理等,因此服务器可能因此给出了通用答案。

作为另一个测试,您可以尝试将 Java 代码更改为其他代码:

String urlStr = "http://duckduckgo.com";

实际上,我在浏览器中打开了您的URL,得到了

{"retHTML":"", "rlist":""}

然后我自己编写了与您类似的代码,并得到了相同的字符串作为响应。所以对我来说,浏览器和 Java 代码获取了相同的信息。但很容易解释为什么情况并非如此。服务器可以检查和检测发送请求的客户端是否是浏览器以及发送请求的类型和位置。基于这些详细信息,服务器可以发回自定义响应。