2010-09-12 12 views
7

Me gustaría desarrollar un cliente http en Java para un proyecto universitario que inicie sesión en el sitio, obtenga datos de datos HTML, complete y envíe formularios. No sé qué http lib para usar: Apache HTTP client - no crea el modelo DOM pero funciona con redirecciones http, multi threading. HTTPUnit: crea un modelo de DOM y es fácil trabajar con formularios, campos, tablas, etc., pero no sé cómo funcionará con la configuración de subprocesamiento múltiple y proxy.¿La mejor biblioteca HTTP para Java?

¿Algún consejo?

Respuesta

8

Parece que está intentando crear una aplicación de raspado web. Para este propósito, recomiendo la biblioteca HtmlUnit.

Hace que sea fácil trabajar con formularios, proxies y datos incrustados en páginas web. Debajo del capó, creo que utiliza el HttpClient de Apache para manejar las solicitudes HTTP, pero esto probablemente sea demasiado bajo para que te preocupe.

Con esta biblioteca puede controlar una página web en Java de la misma manera que la controlaría en un navegador web: haciendo clic en un botón, escribiendo texto, seleccionando valores.

Éstos son algunos ejemplos de HtmlUnit's getting started page:

enviar un formulario:

@Test 
public void submittingForm() throws Exception { 
    final WebClient webClient = new WebClient(); 

    // Get the first page 
    final HtmlPage page1 = webClient.getPage("http://some_url"); 

    // Get the form that we are dealing with and within that form, 
    // find the submit button and the field that we want to change. 
    final HtmlForm form = page1.getFormByName("myform"); 

    final HtmlSubmitInput button = form.getInputByName("submitbutton"); 
    final HtmlTextInput textField = form.getInputByName("userid"); 

    // Change the value of the text field 
    textField.setValueAttribute("root"); 

    // Now submit the form by clicking the button and get back the second page. 
    final HtmlPage page2 = button.click(); 

    webClient.closeAllWindows(); 
} 

utilizando un servidor proxy:

@Test 
public void homePage_proxy() throws Exception { 
    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "http://myproxyserver", myProxyPort); 

    //set proxy username and password 
    final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider(); 
    credentialsProvider.addProxyCredentials("username", "password"); 

    final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); 
    assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText()); 

    webClient.closeAllWindows(); 
} 

La clase WebClient es único roscado, por lo que cada hilo que ofertas con una página web necesitará su propia instancia WebClient.

A menos que necesite para procesar Javascript o CSS, también se puede desactivar estos cuando se crea el cliente:

WebClient client = new WebClient(); 
client.setJavaScriptEnabled(false); 
client.setCssEnabled(false); 
1

HTTPUnit es para pruebas unitarias. A menos que quiera decir "cliente de prueba", no creo que sea apropiado para crear una aplicación.

I varita para desarrollar cliente HTTP en Java

Te das cuenta, por supuesto, que el cliente HTTP Apache no es su respuesta. Parece que quieres crear una primera aplicación web.

Necesitará servlets y JSP. Obtenga Apache's Tomcat y aprenda suficientes JSP y JSTL para hacer lo que necesita hacer. No te molestes con los marcos, ya que es el primero.

Cuando lo tenga en ejecución, intente con un marco como Spring.

+0

La pregunta parece ser bastante clara del lado del cliente. Los servlets y JSP no son relevantes para la funcionalidad del lado del cliente. – lexicore

+0

No parece que jorik1000 intente desarrollar una aplicación de servidor, sino un cliente web especializado que raspa y envía información. HttpUnit está diseñado para facilitar las pruebas unitarias de páginas web, pero como consecuencia también es una buena herramienta para trabajar con una página web de alto nivel en aspectos generales como extraer información y rellenar formularios. –

+1

¿Las JSP no son del lado del cliente? – duffymo

1

parece ser un soporte para Java cURL:
http://curl.haxx.se/libcurl/java/

+3

Me gusta cURL, pero ¿por qué depender de una biblioteca C nativa cuando hay una biblioteca Java pura como Apache HTTPClient? –

1

depende de la complejidad de sus sitios web son. Las opciones son Apache HttpClient (más algo como JTidy) o paquetes orientados a pruebas como HtmlUnit o Canoo WebTest. HtmlUnit es bastante poderoso; podrías procesar JavaScript, por ejemplo.

+0

+1 para señalar [Canoo WebTest] (http://webtest.canoo.com/webtest/manual/WebTestHome.html). Es nuevo para mí Pero parece que está diseñado más específicamente para páginas de prueba y no es adecuado para la manipulación general de páginas y la extracción de datos. ¿Cómo se compara con HtmlUnit? –

0

Jetty tiene una buena biblioteca lado del cliente. Me gusta usarlo porque a menudo necesito crear un servidor junto con el cliente.Apache HTTP Client es realmente bueno y parece tener algunas características más que funcionan como poder resolver un proxy usando SSL.

5

HTTPUnit es para fines de prueba, no creo que sea el más adecuado para ser incrustado dentro de su aplicación.

Cuando desee consumir recursos HTTP (como páginas web), le recomendaría Apache HTTPClient. Pero puede encontrar este marco a bajo nivel para su caso de uso, que es raspado de páginas web. Así que recomendaría un marco de integración como Apache Camel para este propósito. Por ejemplo, la siguiente ruta lee una página web (usando Apache HTTPClient), transforma el HTML a HTML bien formado (usando TagSoup) y transforma el resultado en una representación XML para su posterior procesamiento.

from("http://mycollege.edu/somepage.html).unmarshall().tidyMarkup().to("xslt:mystylesheet.xsl") 

Puede seguir procesando el XML resultante utilizando XPath o transformándolo en un POJO utilizando JAXB, por ejemplo.

+0

Uso HtmlUnit porque es fácil. Puedo extraer la información que necesito de una página de XPath y luego escapar. Lo que estás sugiriendo suena como excesivo. ¿Por qué lo recomiendas de esta manera? ¿Qué hay de malo con usar HtmlUnit en una aplicación? –

+0

+1 por mencionar el combo HttpClient + TagSoup. Cuando rodé mi propia biblioteca de raspado, funcionaron muy bien juntos, y fueron más rápidos que la HtmlUnit completa. –

+1

Tenga en cuenta la parte 'Unidad', estas bibliotecas se centran principalmente en pruebas (unidad). Sin embargo, eliminé la referencia a HTMLUnit ya que proporciona funciones de raspado más generales. –

0

Si realmente desea simular un navegador, entonces Selenium RC

+0

selenio RC ejecuta pruebas sobre el navegador real –

Cuestiones relacionadas