2016-08-15 2 views
0

Я написал программное обеспечение для очистки данных, используя JSOUP lib в Java. Я размещаю некоторые данные on this page и им получаю результаты с представленной страницы. Все работает отлично, но недавно они обновили сайт и теперь после 300-500 результатов эта страница недоступна для меня, ее сломаны в течение следующих нескольких часов. Когда я вручную меняю проксиИзменение прокси-сервера при очистке данных

System.setProperty("http.proxyHost", proxy); 
System.setProperty("http.proxyPort", proxyPort); 

Затем мое приложение продолжается, и все снова работает нормально. Проблема в том, что я должен вручную обновлять прокси каждый раз, когда получаю исключение Read time.

Есть ли другой способ обойти этот block-ip filter после 500+ результатов или я должен сам вводить прокси каждый раз, когда мой ip блокируется?

+0

Лучшим решением было бы реализовать какое-то простое формирование трафика вместо того, чтобы забивать удаленный сервер, т. Е. Уменьшать скорость сканирования и выполнять более вежливое сканирование/очищение. – haddr

+0

@haddr вы можете объяснить мне немного больше? например, теперь моя скорость соскабливания составляет 2-3 результата в секунду. Если я уменьшу его до 1 результата в секунду, вы думаете, что он не будет блокировать веб-сайт? –

+0

См. Ответ ниже, поле комментариев немного мало. – haddr

ответ

1

Я думаю, что реальная проблема заключается не в том, как переключать прокси, а в том, что вы нажимаете некоторые ограничения на целевой машине. Пожалуйста, имейте в виду, что некоторые серверы сильно загружены или должны обслуживать контент для других пользователей. Поэтому они устанавливают некоторые ползучие квоты или другие лимиты DoS, так что труднее исчерпывать местные ресурсы одним человеком, который интенсивно сканирует. Он варьируется от веб-сайта до веб-сайта, но это то, что вам нужно проверить, экспериментируя. Если ваш сервер дает вам 2-3 страницы/сек, это не так уж плохо. Проверьте, например, искатель Heritrix. По умолчанию он реализует правила для «Ответственного сканирования» [1], что означает, что искатель пытается быть вежливым с удаленным сервером. Например: по умолчанию он ожидает 5 секунд до выдачи другого запроса на тот же сервер. Существует также коэффициент задержки (по умолчанию 5), говоря, что если для ответа на сервер требуется 1 секунда, мы, вероятно, не должны выдавать более 1 секунды в 5 сек.

Возвращаясь к проблеме: что вам нужно, чтобы проверить это:

  • сколько запросов вы можете оформить на сервер в каком количестве времени? Когда вы его обнаружите, попробуйте распределить свои запросы в течение заданного временного интервала, чтобы никогда не превышать квоту.
  • Возможно, ограничение ограничено полосой пропускания? Как насчет использования HTTP/1.1 и сжатия gzip?
  • Если удаленный сервер поддерживает HTTP/1.1, возможно, вы можете использовать «connection: keep-alive» и сделать, например, 10 или 20 запросов по одному и тому же HTTP-соединению?
  • Посмотрите, можете ли вы запустить свой сканер в течение ночи, возможно, сервер занят меньше, и ваша очередь запросов может быть загружена быстрее.
  • Будьте готовы к тому, что ваше сканирование может занять некоторое время.

В любом случае имейте в виду, что сканирование может быть очень тяжелым для некоторых серверов, и им по-прежнему нужны ресурсы для обслуживания других посетителей. Я знаю, что это не совсем ответ на исходную задачу, но я думаю, что это другой способ решить это :)

[1] https://webarchive.jira.com/wiki/display/Heritrix/Responsible+Crawling

+0

Мне очень нравится ваш образ мышления, и это очень помогает мне. Вы указали мне правильно! благодаря –

0

Если вы не возражаете против использования внешнего API, вам можете попробовать использовать шахту https://gimmeproxy.com. Он постоянно проверяет прокси-серверы и обеспечивает случайный рабочий с каждым запросом.

Смежные вопросы