Java: эффективность HtmlUnit, заменяющая PHP CURL?

#java #php #http #curl #htmlunit

#java #php #http #curl #htmlunit

Вопрос:

У меня есть класс spider, который по запросу пользователя запускает веб-сайты-пауки для контента. В результате каждого поиска загружается около 30 веб-сайтов, на них размещается информация, а затем эта информация стандартизируется.

Я написал это на PHP, используя CURL, поскольку PHP не хватает многозадачности, я хотел бы переключиться на Java (я знаю о многопроцессорном curl, который не соответствует моим требованиям). Мне нужен http-клиент, который может ПУБЛИКОВАТЬ / ПОЛУЧАТЬ, получать и устанавливать cookies, а также изменять HTTP-заголовки.

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

Как вы думаете, это было бы проблемой и есть ли у вас другие предложения по замене CURL в Java? Должен ли я использовать привязку Java CURL? Это вопрос эффективности и нагрузки на сервер.

Комментарии:

1. Я протестировал эффективность: 4) Java / HtmlUnit 6,2 секунды 3) Java / Apache_HTTPClient 5,3 секунды 2) PHP / CURL 4,92 секунды 1) Java / Jsoup 1,8 секунды

Ответ №1:

Возможно, взгляните на Http-клиент Apache?

Вы можете создать HttpClient для каждого потока и использовать его для выполнения ваших запросов

 while (running) {

HttpClient client = new DefaultHttpClient();
HttpGet GET = new HttpGet("mydomain.com/path.html");
HttpResponse response = client.execute(GET);
// do stuff with response

}
  

Еще лучше, если вы повторно используете HttpClient между запросами, он запомнит файлы cookie, отправленные в ответ на предыдущие ответы, и автоматически применит их к вашему следующему запросу. В этом смысле один HttpClient моделирует http-диалог.

Итак, если вы сделали

  client.execute(GET1);
  // cookies received in response
  client.execute(GET2);
  // the second get will send the cookies back received from GET1 response.
  

Затем вы могли бы взглянуть на Java ExecutorService, который упростит размещение заданий spider и запуск нескольких потоков.

Ответ №2:

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

HtmlUnit предлагает богатый API для синтаксического анализа веб-страниц, а также поиска и оценки элементов на странице.

Более простым решением было бы просто использовать HttpClient (который HtmlUnit использует под капотом). Это просто загрузило бы всю страницу и вернуло бы ее в виде OutputStream или String. Затем вы можете использовать регулярные выражения для поиска ссылок и т.д. Вероятно, больше похоже на то, что вы делаете в настоящее время с curl.

Ответ №3:

попробуйте http://code.google.com/p/crawler4j простое и эффективное решение, когда вам не нужен javascript.