Если вы введете это в URL браузера:
Он возвращает много данных. Но если я попытаюсь захватить эти данные с помощью 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.




Попробуйте запустить это — он получит этот 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":""}
Да, именно поэтому я заявил, что поведение, которое вы видите, не является чем-то, что делает (или не делает) Java. ;)
Понятно. Хорошая подсказка. Так как же правильно получить данные из java-программы, как если бы запрос делал браузер?
Это зависит от удаленного сервера. Любой веб-сервер может просматривать детали входящего запроса и обрабатывать их так или иначе. Он может попытаться определить, исходит ли запрос от мобильного устройства или компьютера, или от определенного типа браузера, или от определенного региона IP, или есть ли действительный реферер, или что-то еще. Если вы намерены использовать конкретный веб-сайт charlotte.realforeclose.com, вы можете переключиться на использование консольного отладчика (в Firefox и Chrome они встроены), чтобы увидеть, какие заголовки запросов отправляются Oни, а затем попытаться воспроизвести их в своем коде Java.
Именно так я получил URL-адрес из заголовка F12 XHR, так как кто-то любезно помог с этим здесь: stackoverflow.com/questions/57033212/…
На самом деле, я открыл ваш URL в браузере и получил
{"retHTML":"", "rlist":""}
Затем я написал свой собственный код, похожий на ваш, и получил в ответ ту же строку. Так что для меня браузер и код Java получили одну и ту же информацию. Но легко объяснимо, как это не должно быть так. Сервер может проверить и определить, является ли клиент, отправляющий запрос, браузером, а также каким типом и из какого местоположения был отправлен запрос. На основе этих сведений сервер может отправить индивидуальный ответ.
Интересно. Какой браузер вы использовали? Я все еще получаю данные в хроме. Но я больше не вижу никаких записей в разделе «Сеть»> «XHR» в консоли отладчика F12.
Я тоже использовал хром
@user3217883 user3217883, у меня такой же ответ ({"retHTML":"", "rlist":""}). И в фаерфоксе и в хроме. Попробуйте очистить кеш вашего браузера и попробуйте еще раз - я думаю, сервер сломался, но ваш браузер возвращает кешированное значение.
Ах, да, именно это и происходило. Человек, его трудно диагностировать, когда вы получаете кешированные данные! Спасибо. Итак, теперь мне нужно выяснить, почему сервер не возвращает данные, как раньше. Слишком много попыток?
Вам все еще нужна помощь в этом?
Когда вы перемещаетесь по странице в браузере, за вас все работает с заголовками. Поэтому, когда вы открываете страницу в первый раз, браузер получает файлы cookie с сервера и отправляет их на сервер в дальнейших запросах. Убедитесь, что ваш код правильно обрабатывает файлы cookie, а также другие необходимые заголовки, например, когда вы открываете страницу в браузере.