2011-09-22 32 views
9

¿Puede usar Jsoup para enviar una búsqueda a Google, pero en lugar de enviar su solicitud a través de "Búsqueda de Google", use "Me siento afortunado"? Me gustaría capturar el nombre del sitio que se devolverá.¿Puede Jsoup simular presionar un botón?

Veo muchos ejemplos de cómo enviar formularios, pero nunca una forma de especificar un botón específico para realizar la búsqueda o el envío del formulario.

Si Jsoup no funciona, ¿qué haría?

+0

¿Quiere decir JSONP? La API de búsqueda de Google es http://code.google.com/apis/customsearch/v1/overview.html – ceejayoz

+0

@Ceejayoz: coloque el mouse sobre la etiqueta '[jsoup]' debajo de la pregunta hasta que aparezca una ventana emergente y luego haga clic en * información * enlace para obtener más información. – BalusC

+0

@BalusC Diría que fue una solicitud bastante justa de aclaración, teniendo en cuenta el contenido de la pregunta y el JSOUP con mayúsculas y una sola letra. – ceejayoz

Respuesta

11

De acuerdo con el código fuente HTML de http://google.com el botón "Me siento afortunado" tiene un nombre de btnI:

<input value="I'm Feeling Lucky" name="btnI" type="submit" onclick="..." /> 

lo tanto, sólo añadiendo el parámetro btnI a la cadena de consulta debe hacer (el valor no importa):

http://www.google.com/search?hl=en&btnI=1&q=your+search+term

lo tanto, esto debería hacer Jsoup:

String url = "http://www.google.com/search?hl=en&btnI=1&q=balusc"; 
Document document = Jsoup.connect(url).get(); 
System.out.println(document.title()); 

Sin embargo, esto dio un error de 403 (Forbidden).

Exception in thread "main" java.io.IOException: 403 error loading URL http://www.google.com/search?hl=en&btnI=1&q=balusc 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:387) 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364) 
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143) 
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:132) 
    at test.Test.main(Test.java:17) 

Quizás Google estaba olfateando el agente de usuario y descubriendo que era Java. Por lo tanto, lo cambié:

String url = "http://www.google.com/search?hl=en&btnI=1&q=balusc"; 
Document document = Jsoup.connect(url).userAgent("Mozilla").get(); 
System.out.println(document.title()); 

Este rendimientos (como se esperaba):

El Código BalusC

El 403 es sin embargo un indicio de que Google no es necesariamente feliz con los robots como eso. Es posible que tenga (temporalmente) prohibido el IP cuando lo hace con demasiada frecuencia.

+0

Gracias BalusC. Eso respondió la pregunta perfectamente. Veo cómo esa solicitud de URL es exclusiva del sitio de Google.Estaba tratando de averiguar si puedes programar literalmente Jsoup para hacer clic en un botón específico usando Google como ejemplo. Mejor aclaro lo que trato de hacer en mi otra pregunta en este sitio. Esa pregunta no recibió respuesta en un mes y se frustró, por lo que me hizo una pregunta diferente con la esperanza de que me ayudara con la primera. Desafortunadamente mi plan fracasó y me disculpo por tomarse su tiempo para responder una pregunta que no resuelve mi problema. – Brian

0

Sí, puede, si puede averiguar cómo se realizan las consultas de búsqueda de Google. Pero esto no está permitido por Google, incluso si tuviera éxito con eso. Debes usar su API oficial para realizar consultas de búsqueda automáticas.

http://code.google.com/intl/en-US/apis/customsearch/v1/overview.html

+0

Gracias por la respuesta. Sin embargo, solo estaba usando google como ejemplo. Tengo un sitio con el que trato de usar JSOUP para iniciar sesión y obtener algo de información. No creo que esté realmente iniciando sesión. Estoy tratando de averiguar cómo simular presionar el botón "iniciar sesión" o "enviar" de forma genérica para asegurarme de que realmente estoy iniciando sesión en el sitio. Perdón por la confusion. – Brian

2

que iba a tratar HtmlUnit para navegar Trough un sitio, y JSOUP para raspar

+0

entonces, ¿cómo se pueden usar htmlUnit y jSoup en combinación? editar: lo tengo ... jSoup.parse puede analizar la cadena html dada por htmlUnit – tObi

Cuestiones relacionadas