Установить sh 50+ URLCподключений одновременно в течение 1-2 секунд - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь собрать живые данные с 50+ динамических c веб-страниц, и мне нужно, чтобы данные обновлялись каждые 1-2 секунды. Для этого у меня есть таймер, запланированный каждые полсекунды, который повторяет следующий метод 50 раз (для 50 URL-адресов):

public double fetchData(String link) {
        String data = null;
        try {
            URL url = new URL();
            urlConn = url.openConnection(link);
            InputStreamReader inStream = new InputStreamReader(urlConn.getInputStream());
            BufferedReader buff = new BufferedReader(inStream);

            /*code that scrapes webpage, stores value in "data"*/
            inStream.close();
            buff.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
}  

Этот метод работает, но занимает около секунды на URL, или 50 SE c всего. Я также пробовал JSoup в надежде на то, что задержка может быть преодолена с помощью следующего кода:

public double fetchData(String link, String identifier) {
        Document doc;
        String data = null;
        try {
            doc = Jsoup.connect(link).timeout(10*1000).get();
            data = doc.getElementById(identifier).parent().child(0).text();
        } catch (IOException e) {
            e.printStackTrace();
        } 
return data;
}

, но у них примерно одинаковое время обработки. Существуют ли более быстрые способы рисования данных с динамических c веб-страниц одновременно, будь то через URLConnection, JSoup или каким-либо другим способом?

1 Ответ

2 голосов
/ 25 апреля 2020

Краткий ответ: «использовать темы». Создайте цепочку для каждого из 50+ URL-адресов, которые вы хотите повторно очищать.

Скорее всего, это не будет иметь большого значения, если вы будете использовать URLConnection, JSoup или каким-либо другим способом выполнять очистку. Фактическое узкое место, вероятно, связано с:

  • нагрузкой и производительностью нагрузки на сервер (ы), который вы копируете из
  • пропускная способность сети
  • сеть latency

Первый из них находится вне вашего контроля (в позитивном ключе!). Последние два ... вы могли бы решить, но только бросив деньги на проблему. Например, вы могли бы заплатить за более качественное сетевое соединение / путь или за альтернативный хостинг, чтобы переместить скребок ближе к сайтам, которые вы пытаетесь очистить.

Переключение на многопоточную очистку улучшит некоторые из них. узкие места, но не устранять их.


Но я не думаю, что то, что вы делаете, является хорошей идеей.

Если вы пишете что-то, что неоднократно повторно очищает одни и те же страницы один раз каждые 1 или 2 секунды они будут замечать . И они собираются предпринять шаги, чтобы остановить вас. Шаги, с которыми будет сложно иметь дело. Такие вещи, как:

  • ограничение скорости ваших запросов
  • блокирование ваших IP-адресов или диапазона IP-адресов
  • отправка вам писем "прекратить и отказаться"

И если это не поможет, может быть, более серьезные вещи.

Реальным решением может быть получение информации более эффективным способом; например, через API. Это может стоить вам денег тоже. Потому что (когда это сводится к этому) ваш сбор будет стоить их денег либо без возврата ... либо с отрицательной отдачей, если ваша деятельность в конечном итоге сократит клики реальных людей на их сайте.

...