Почему InputStreamReader возвращает другой контент, чем браузер?

Если вы введете это в URL браузера:

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

Он возвращает много данных. Но если я попытаюсь захватить эти данные с помощью 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 нажимайте на каждый элемент, пока не увидите ожидаемые данные. Затем щелкните его правой кнопкой мыши и выберите Копировать->Копировать заголовки запроса.

Вот что скопировано:

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? Я знаю, как это сделать в javascript, но не в java.

Когда вы перемещаетесь по странице в браузере, за вас все работает с заголовками. Поэтому, когда вы открываете страницу в первый раз, браузер получает файлы cookie с сервера и отправляет их на сервер в дальнейших запросах. Убедитесь, что ваш код правильно обрабатывает файлы cookie, а также другие необходимые заголовки, например, когда вы открываете страницу в браузере.

omegastripes 15.07.2019 23:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте запустить это — он получит этот 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";

curl также вернул {"retHTML":"", "rlist":""}

user3217883 15.07.2019 23:01

Да, именно поэтому я заявил, что поведение, которое вы видите, не является чем-то, что делает (или не делает) Java. ;)

kaan 15.07.2019 23:04

Понятно. Хорошая подсказка. Так как же правильно получить данные из java-программы, как если бы запрос делал браузер?

user3217883 15.07.2019 23:05

Это зависит от удаленного сервера. Любой веб-сервер может просматривать детали входящего запроса и обрабатывать их так или иначе. Он может попытаться определить, исходит ли запрос от мобильного устройства или компьютера, или от определенного типа браузера, или от определенного региона IP, или есть ли действительный реферер, или что-то еще. Если вы намерены использовать конкретный веб-сайт charlotte.realforeclose.com, вы можете переключиться на использование консольного отладчика (в Firefox и Chrome они встроены), чтобы увидеть, какие заголовки запросов отправляются Oни, а затем попытаться воспроизвести их в своем коде Java.

kaan 15.07.2019 23:09

Именно так я получил URL-адрес из заголовка F12 XHR, так как кто-то любезно помог с этим здесь: stackoverflow.com/questions/57033212/…

user3217883 15.07.2019 23:12
Ответ принят как подходящий

На самом деле, я открыл ваш URL в браузере и получил

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

Затем я написал свой собственный код, похожий на ваш, и получил в ответ ту же строку. Так что для меня браузер и код Java получили одну и ту же информацию. Но легко объяснимо, как это не должно быть так. Сервер может проверить и определить, является ли клиент, отправляющий запрос, браузером, а также каким типом и из какого местоположения был отправлен запрос. На основе этих сведений сервер может отправить индивидуальный ответ.

Интересно. Какой браузер вы использовали? Я все еще получаю данные в хроме. Но я больше не вижу никаких записей в разделе «Сеть»> «XHR» в консоли отладчика F12.

user3217883 15.07.2019 23:32

Я тоже использовал хром

Michael Gantman 15.07.2019 23:35

@user3217883 user3217883, у меня такой же ответ ({"retHTML":"", "rlist":""}). И в фаерфоксе и в хроме. Попробуйте очистить кеш вашего браузера и попробуйте еще раз - я думаю, сервер сломался, но ваш браузер возвращает кешированное значение.

Bor Laze 15.07.2019 23:36

Ах, да, именно это и происходило. Человек, его трудно диагностировать, когда вы получаете кешированные данные! Спасибо. Итак, теперь мне нужно выяснить, почему сервер не возвращает данные, как раньше. Слишком много попыток?

user3217883 16.07.2019 00:24

Вам все еще нужна помощь в этом?

Michael Gantman 16.07.2019 19:29

Другие вопросы по теме