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

Java 为什么InputStreamReader返回的内容与浏览器不同?,java,html,url,inputstreamreader,Java,Html,Url,Inputstreamreader,如果在浏览器url中输入此项: 它返回大量数据。但是,如果我尝试使用输入StreamReader捕获该数据,则返回的唯一数据是 {“retHTML”:“”“rlist”:“”} 节目如下: List<Property> scrapePropertyInfo(List<Date> auctionDates) { List<Property> properties = new ArrayList<>(); String urlStr

如果在浏览器url中输入此项:

它返回大量数据。但是,如果我尝试使用输入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;
}
列出scrapePropertyInfo(列出拍卖日期){
列表属性=新的ArrayList();
字符串urlStr=”https://charlotte.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&AUCTIONDATE=07/16/2019";
字符串str=null;
试一试{
URL=新URL(urlStr);
BufferedReader in=新的BufferedReader(新的InputStreamReader(url.openStream());
StringBuilder StringBuilder=新的StringBuilder();
而((str=in.readLine())!=null){
stringBuilder.append(str);
}
System.out.println(“Url:+urlStr”);
System.out.println(stringBuilder.toString());
in.close();
}捕获(格式错误){
Logger.getLogger(CharlotteCtyFL.class.getName()).log(Level.SEVERE,null,ex);
}捕获(IOEX异常){
Logger.getLogger(CharlotteCtyFL.class.getName()).log(Level.SEVERE,null,ex);
}
归还财产;
}
有人知道为什么吗

编辑:现在聪明一点了 因此,显然需要向服务器发送的内容比url要多。由于这是动态的ajax数据,只有在使用原始web页面时,才需要对其进行优化,因此需要用java进行模拟

我发现了如何在chrome F12调试器控制台中获取这些信息。在网络->XHR->预览下,单击每个项目,直到看到预期的数据。然后右键单击它并选择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&uu=1563231065712 HTTP/1.1 主持人:charlotte.realforeclose.com 连接:保持活力 接受:application/json,text/javascript,/;q=0.01 X-request-With:XMLHttpRequest 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/75.0.3770.100 Safari/537.36 来源: 推荐人: 接受编码:gzip,deflate,br 接受语言:en-US,en;q=0.9 Cookie:cfid=6f228aa1-bb7e-4734-92ff-39eabf23ed9b;cftoken=0;CF_CLIENT_CHARLOTTE_REALFORECLOSE_TC=156329207612;AWSELB=E7779D5F1C1F6ABE3513A5C5B6B0C754520B66675A407900314ABAC533A52E93FD1A8D7401D89BC8D5E8B98059C8AAC5507D12A2C6ED07F7E7CB77311BD7FB09B738DB945_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=realautch.com | utmccn=(转介)| utmcmd=转介| utmcct=/客户站点__utmt_UA-51657054-1=1__utmb=65865852.2.10.1563231014;testcookiesenabled=已启用;CF_客户_CHARLOTTE_REALFORECLOSE_LV=1563231067363;CF\u客户\u夏洛特\u真实止赎\u HC=73


现在,我如何将其纳入来自java的请求中?我知道如何使用javascript,但不知道如何使用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请求并决定返回什么。在Java代码中,与这个简单的
curl
示例一样,没有浏览器头、用户代理等,因此服务器可能会给出一个通用的答案

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

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

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

{“retHTML”:“”“rlist”:“”}


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

curl还返回了{“retHTML”:““rlist”:”}是的,这就是为什么我说您看到的行为不是Java正在(或没有)做的事情知道了。好线索。那么,从java程序中获取数据的正确方法是什么,就好像它是发出请求的浏览器一样?这取决于远程服务器。任何web服务器都可以自由查看入站请求的详细信息,并以某种方式进行处理。它可能会尝试确定请求是否来自移动设备与计算机,或者某个浏览器类型,或者某个IP区域,或者是否有有效的推荐人,或者任何数量的东西。如果您打算使用特定的
charlotte.realforeclose.com
网站,您可以切换到使用控制台调试器(Firefox和Chrome都内置了调试器)查看它们发送的请求头,然后尝试在Java代码中复制它们。这正是我从F12 XHR头中获取url的方式,正如有人在这里善意地帮助的那样:当你在浏览器中导航一个页面时,它会让所有的内容都与标题一起工作。所以,当您第一次打开页面时,浏览器会从服务器接收cookie,并在进一步请求时将其发送到服务器。确保您的代码以正确的方式处理cookie,并提供其他必要的标题,如在浏览器中打开页面时。有趣。你用的是哪个浏览器?我还在用chrome获取数据。但在F12调试器控制台中,我再也看不到Network>XHR下的任何条目了well@user3217883,我也得到了相同的响应({“retHTML”:“,“rlist”:“})。在Firefox和Chrome中。尝试清除浏览器的缓存并再试一次-我猜,服务器已损坏,但浏览器返回缓存值。啊,是的,这就是发生的情况。在获取缓存数据时,很难进行诊断!Th