Код ответа HTTP 429 при чтении HTML

В java я хочу прочитать и сохранить весь HTML из URL-адреса (instagram), но получаю ошибку 429 (слишком много запросов). Я думаю, это потому, что я пытаюсь прочитать больше строк, чем лимиты запросов.

StringBuilder contentBuilder = new StringBuilder();
try {
    URL url = new URL("https://www.instagram.com/username");
    URLConnection con = url.openConnection();
    InputStream is =con.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String str;
    while ((str = in.readLine()) != null) {
        contentBuilder.append(str);
    }
    in.close();
} catch (IOException e) {
    log.warn("Could not connect", e);
}
String html = contentBuilder.toString();

А ошибка такова;

Could not connect
java.io.IOException: Server returned HTTP response code: 429 for URL: https://www.instagram.com/username/

И это также показывает, что ошибка возникает из-за этой строки

InputStream is =con.getInputStream();

Кто-нибудь знает, почему я получаю эту ошибку и / или что делать, чтобы ее решить?


person Fikret    schedule 28.09.2018    source источник
comment
Думаю, это потому, что я пытался прочитать больше строк, чем ограничено лимитом запросов ⬅ Кажется, вы уже ответили на свой вопрос самостоятельно ... В любом случае, возможно, уместно следующее: stackoverflow.com/questions/33477861/, stackoverflow.com/questions/33435965/, stackoverflow.com/questions/49583489 /   -  person sideshowbarker    schedule 28.09.2018
comment
См. Также stackoverflow.com/questions/49606300/ и заголовок stackoverflow.com/questions/37416195/   -  person sideshowbarker    schedule 28.09.2018
comment
И я думаю, вы достигли какого-то ограничения на подключение на стороне сервера; P   -  person Antoniossss    schedule 28.09.2018


Ответы (1)


Проблема могла быть вызвана тем, что соединение не было закрыто / отключено. Для входных данных try-with-resources для автоматического закрытия, даже при исключении или возврате, тоже полезно. Также вы создали InputStreamReader, который будет использовать кодировку по умолчанию для машины, на которой будет запускаться приложение, но вам понадобится кодировка содержимого URL-адреса. readLine возвращает строку без окончания строки (что в целом очень полезно). Так что добавьте один.

StringBuilder contentBuilder = new StringBuilder();
try {
    URL url = new URL("https://www.instagram.com/username");
    URLConnection con = url.openConnection();
    try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream(), "UTF-8"))) {
        String line;
        while ((line = in.readLine()) != null) {
            contentBuilder.append(line).append("\r\n");
        }
    } finally {
        con.disconnect();
    } // Closes in.
} catch (IOException e) {
    log.warn("Could not connect", e);
}
String html = contentBuilder.toString();
person Joop Eggen    schedule 28.09.2018
comment
Привет, спасибо за ответ, но я не мог понять, где должно быть URLConnection - person Fikret; 01.10.2018
comment
Затем я получаю ошибку несовместимого типа в URLConnection. Требуется: java.lang.AutoCloseable Найдено: java.net.URLConnection - person Fikret; 01.10.2018
comment
Глупая ошибка с моей стороны; SQLConnection поддерживает автоматическое закрытие. URLConnection использует disconnect(). Исправленный код. - person Joop Eggen; 01.10.2018
comment
Слишком много запросов может происходить из-за количества подключений. Для нормального закрытия соединений по истечении времени ожидания потребуется полчасовая пауза. Добавьте ведение журнала, чтобы быть уверенным, что код не выполняется много раз, например, во время перерисовок. - person Joop Eggen; 01.10.2018
comment
Я нашел проблему. В html только последние 12 постов. Вот почему я не могу получить больше таким образом. - person Fikret; 04.10.2018
comment
Вы можете попытаться уменьшить частоту запросов, например, держать каждый запрос полсекунды перед отправкой; если тем временем предполагается отправить еще один, объедините их в один; как это. Или keep-alive может иметь влияние. - person Joop Eggen; 04.10.2018