java web-scraping jsoup

java - ¿Cómo llenar un formulario con Jsoup?



web-scraping (1)

Estoy tratando de navegar a la página de descripción del sitio web de California http://kepler.sos.ca.gov/ . pero incapaz de ir.

Luego, tengo un formulario html, en el que estoy enviando una solicitud, no puedo agregar el formulario aquí, pero es una simple solicitud POST a http://kepler.sos.ca.gov/ con los parámetros requeridos

Puedo obtener __EVENTTARGET y __EVENTARGUMENT de la página anterior desde la que vine aquí.

¿Qué estoy haciendo mal?

código:

String url = "kepler.sos.ca.gov/"; Connection.Response resp = Jsoup.connect(url) .timeout(30000) .method(Connection.Method.GET) .execute(); Document responseDocument = resp.parse(); Map<String, String> loginCookies = resp.cookies(); eventValidation=responseDocument.select("input[name=__EVENTVALIDATION]").first(); viewState = responseDocument.select("input[name=__VIEWSTATE]").first();


Desea usar FormElement . Esta es una característica útil de Jsoup. Es capaz de encontrar los campos declarados dentro de un formulario y publicarlos por usted. Antes de publicar el formulario, puede establecer el valor de los campos utilizando la API Jsoup.

No un:

En los códigos de ejemplo a continuación, siempre verá llamadas al método de Element#select seguido de una llamada al Elements#first método de Elements#first .

Por ejemplo: responseDocument.select("form#aspnetForm").first()

Jsoup 1.11.1 ha introducido una alternativa más eficiente: Element#selectFirst . Puede usarlo como un reemplazo directo de la alternativa original.

Por ejemplo:
responseDocument.select("form#aspnetForm").first()
puede ser reemplazado por
responseDocument.selectFirst("form#aspnetForm")

CÓDIGO DE MUESTRA

// * Connect to website String url = "http://kepler.sos.ca.gov/"; Connection.Response resp = Jsoup.connect(url) // .timeout(30000) // .method(Connection.Method.GET) // .execute(); // * Find the form Document responseDocument = resp.parse(); Element potentialForm = responseDocument.select("form#aspnetForm").first(); checkElement("form element", potentialForm); FormElement form = (FormElement) potentialForm; // * Fill in the form and submit it // ** Search Type Element radioButtonListSearchType = form.select("[name$=RadioButtonList_SearchType]").first(); checkElement("search type radio button list", radioButtonListSearchType); radioButtonListSearchType.attr("checked", "checked"); // ** Name search Element textBoxNameSearch = form.select("[name$=TextBox_NameSearch]").first(); checkElement("name search text box", textBoxNameSearch); textBoxNameSearch.val("cali"); // ** Submit the form Document searchResults = form.submit().cookies(resp.cookies()).post(); // * Extract results (entity numbers in this sample code) for (Element entityNumber : searchResults.select("table[id$=SearchResults_Corp] > tbody > tr > td:first-of-type:not(td[colspan=5])")) { System.out.println(entityNumber.text()); } public static void checkElement(String name, Element elem) { if (elem == null) { throw new RuntimeException("Unable to find " + name); } }

SALIDA (a partir de este escrito)

C3036475 C3027305 C3236514 C3027304 C3034012 C3035110 C3028330 C3035378 C3124793 C3734637

Ver también:

En este ejemplo, FormElement sesión en el sitio web de GitHub utilizando la clase FormElement .

// # Constants used in this example final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"; final String LOGIN_FORM_URL = "https://github.com/login"; final String USERNAME = "yourUsername"; final String PASSWORD = "yourPassword"; // # Go to login page Connection.Response loginFormResponse = Jsoup.connect(LOGIN_FORM_URL) .method(Connection.Method.GET) .userAgent(USER_AGENT) .execute(); // # Fill the login form // ## Find the form first... FormElement loginForm = (FormElement)loginFormResponse.parse() .select("div#login > form").first(); checkElement("Login Form", loginForm); // ## ... then "type" the username ... Element loginField = loginForm.select("#login_field").first(); checkElement("Login Field", loginField); loginField.val(USERNAME); // ## ... and "type" the password Element passwordField = loginForm.select("#password").first(); checkElement("Password Field", passwordField); passwordField.val(PASSWORD); // # Now send the form for login Connection.Response loginActionResponse = loginForm.submit() .cookies(loginFormResponse.cookies()) .userAgent(USER_AGENT) .execute(); System.out.println(loginActionResponse.parse().html()); public static void checkElement(String name, Element elem) { if (elem == null) { throw new RuntimeException("Unable to find " + name); } }

Todos los datos del formulario son manejados por la clase FormElement para nosotros (incluso la detección del método del formulario). Se FormElement#submit Connection preparada al invocar el método de FormElement#submit . Todo lo que tenemos que hacer es completar esta conexión con encabezados adicionales (cookies, agente de usuario, etc.) y ejecutarla.