2013-10-12 2 views
0

Я использую Apache HttpComponents с 150 потоками, чтобы загрузить исходный код HTML для примерно 5000 различных URL-адресов.Apache HttpComponents request.get.excute не возвращает правильный исходный код HTML

URL-адреса содержатся в LinkedBlockingQueue и SourceGetterThreads берут из очереди, когда это возможно. Затем поток попытается загрузить исходный код с помощью EntityUtils.toString(HttpClient.execute().getEntity). Строковое представление исходного кода HTML затем помещается в другое LinkedBlockingQueue, где у меня есть еще 10 потоков, готовых отобразить полезную работу над исходным кодом, который они берут из второй очереди.

Моя проблема заключается в том, что я заметил ошибки в работе, которые были сформированы в исходном коде. Я использую Matcher для соответствия определенным шаблонам и записи найденных паттернов. Однако иногда исходный код является неправильным и не соответствует URL (то есть исходный код, сохраненный в моей java-памяти, не совпадает с исходным кодом при просмотре в Chrome или FireFox). Это, по-видимому, случайное, и поэтому иногда исходный код правильный, а иногда и нет.

Кто-нибудь знает, почему это так?

+0

Вы не указали нигде рядом с количеством деталей, которое нам нужно будет ответить. –

+0

Я попытался сохранить его абстрактным и воздержаться от слишком многого, чтобы tl; dr. Я ценю отрицательное, но вместо того, чтобы запрашивать дополнительную информацию. – james

+0

Это можно изменить. –

ответ

0

Скорее всего, сайты, на которых вы пытаетесь найти страницы, выполняют какую-либо фильтрацию запросов на основе заголовков запросов, например User-Agent. Таким образом, они могут просто вернуть различное содержание на основе анализа result.There много причин, чтобы сделать это:

  1. Предоставлять поисковые робот с соответствующей информацией
  2. Запретить веб-сканеры из выборки содержимого сайта
  3. Признайте мобильные устройства и поставить их пользователь с различным HTML/CSS/JS
  4. Если вы запрашивая тот же сайт интенсивно какое-то защит DOS-атак могут быть вызваны, в результате чего страницы ошибки окурка возвращаются вместо обычного содержания

Если вы хотите, чтобы получить такое же содержание, как и в браузере, то самая основная рекомендация для клиента вести себя как браузер:

  1. Всегда обеспечивайте User-Agent заголовка
  2. Follow HTTP редирект (HTTP коды 302,303)
  3. поддерживать куки и процедуры аутентификации, если требуется
  4. Будьте готовы поддержать схему

HTTPS без исходного кода у ou're пытается запустить, трудно сказать больше, но Apache HTTP Client, который вы используете, определенно способен делать все это. Вот, например, как установить значение User-Agent:

String url = "http://www.google.com/search?q=httpClient"; 
HttpClient client = new DefaultHttpClient(); 
HttpGet request = new HttpGet(url); 
request.addHeader("User-Agent","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 
HttpResponse response = client.execute(request); 
+0

жаль быть болью, но знаете ли вы, как я собирался настроить заголовок user-agent? – james

+0

Нет проблем) Пожалуйста, обратитесь к обновленному ответу для образца кода. Однако это может зависеть от версии Http Client. (мой код использует 4.X) – Jk1

+0

большое спасибо! – james

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