Скачивание файла с HTTP GET, передача куки в java
Я хочу разобрать документ HTML из URL в Java.
Когда я ввожу URL в моем браузере (Chrome), он не отображает HTML-страницу, но загружает ее.
Таким образом, URL является ссылкой за кнопкой "скачать" на веб-странице. Пока проблем нет. URL-адрес " https://www.shazam.com/myshazam/download-history ", если я вставлю его в свой браузер, он загрузится нормально. Но когда я пытаюсь загрузить его с помощью Java, я получаю 401 (запрещено) ошибку.
Я проверял инструмент Chrome Network при загрузке URL и заметил, что мои данные профиля и файлы cookie регистрации были переданы с http GET.
Я пробовал много разных методов, но ни один из них не работал. Итак, мой вопрос, как я могу сделать это с Java? Как я могу получить (скачать) файл HTML и проанализировать его?
Обновить:
Это то, что мы нашли до сих пор (благодаря Эндрю Регану):
BasicCookieStore store = new BasicCookieStore();
store.addCookie( new BasicClientCookie("profile-data", "value") ); // profile-data
store.addCookie( new BasicClientCookie("registration", "value") ); // registration
Executor executor = Executor.newInstance();
String output = executor.use(store)
.execute(Request.Get("https://www.shazam.com/myshazam/download-history"))
.returnContent().asString();
Кажется, последняя строка кода вызывает исключение NullPointerException. Кажется, остальная часть кода работает нормально для загрузки незащищенных веб-страниц.
3 ответа
Я нашел ответ сам. Используя HttpURLConnection, этот метод можно использовать для "аутентификации" различных сервисов. Я использовал встроенные в Chrome сетевые инструменты для получения значений cookie запроса GET.
HttpURLConnection con = (HttpURLConnection) new URL("https://www.shazam.com/myshazam/download-history").openConnection();
con.setRequestMethod("GET");
con.addRequestProperty("Cookie","registration=Cooki_Value_Here;profile-data=Cookie_Value_Here");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Вы можете попробовать просто добавить значения cookie в GET-запрос, используя, например, HttpClient Fluent API:
CookieStore store = new BasicCookieStore();
store.addCookie( new BasicClientCookie(name, value) ); // profile-data
store.addCookie( new BasicClientCookie(name, value) ); // registration
Executor executor = Executor.newInstance();
String output = executor.cookieStore(store)
.execute(Request.Get("https://www.shazam.com/myshazam/download-history"))
.returnContent().asString();
Для разбора вы могли бы тогда сделать:
Element dom = Jsoup.parse(output);
for (Element element : result.select("tr td")) {
String eachCellValue = element.text();
// Whatever
}
(Вы не дали больше подробностей, чем это)
Поэтому, если вы удалите эти файлы cookie или используете приватный сеанс, браузер должен воспроизвести то, что вы видите в коде.
Я предполагаю, что вам нужно сначала перейти на " http://www.shazam.com/myshazam" и войти в систему.