Httpclient obtener datos de la web del Seniat

Iniciado por JNell, 9 Marzo 2013, 19:33 PM

0 Miembros y 1 Visitante están viendo este tema.

JNell

Buenas, soy nuevo aca en el foro, ya lei las reglas de antes del post y esas cuestiones, si tengo algun error avisenme, que aca nadie nace siendo perfecto.  ::)
Bueno para empezar, tengo un codigo de varios ejemplos que encontre navegando en la web, solo le implemente algunas cosas como envio de parametros, y agrege ciertas cosas a lo que necesito... mi idea es hacer lo que menciono en el titulo.... "Obtener datos de la web del Seniat"
http://contribuyente.seniat.gob.ve/BuscaRif/BuscaRif.jsp  <<< Esta es la web.
El problema es que al ser .jsp "javascrip" me es diferente a la mayoria de las webs.
:( :-(
Para no enrrollarme tanto lo pondre con ejemplos,
en la web del seniat utilizo el rif J299191388 .. luego le doy "buscar" y luego me genera el nombre de la empresa, etc, etc... Lo que quiero es obtener ese nombre que seguramente esta hecho en alguna parte del body en html (para ello probe usando firebug... bastante util). Quiero capturar ese nombre parsearlo a un String entendible y plasmarlo ya sea en un jtextfield o area... en fin esto sera para el final, lo que primero necesito es lograr el envio de parametros y capturar ese nombre y parsear ese codigo html... No soy de las personas que vienen a pedir cosas asi como asi.. de modo que para el parseo lo que mas he visto por internet es Json y Json...

Bueno ahora el codigo... esto fue en base a muchos ejemplos que encontre en la web, adaptado mas o menos a lo que yo trato de hacer... esta hecho en base a esta web. "Que no es .jsp"
http://www.spritmonitor.de/en/

Código (java) [Seleccionar]
package conectseniat;

import java.io.*;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
// Librerias utilizadas, HttpComponents de Apache.
// HttpClient... ojo no de las que vienen con el IDE asi que a bajarlas....

/**
*
* @author Nell
*/
public class ConectSeniat {

    /**
     * @param args the command line arguments
     */
   
    public static void main (String[] args){
       
       
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
// Esta página guarda la autentificación en una cookie, por ello lo primero es
// acceder a la web donde está el formulario de registro
HttpGet httpget = new HttpGet("http://www.spritmonitor.de/en/");       
try {
response = httpclient.execute(httpget);
System.out.println("Estado: " + response.getStatusLine().toString()); // Esto solo para comprobar los estados, los mas comunes 200 / 302 / 404
HttpEntity entity = response.getEntity(); 
entity = response.getEntity();         
if (entity != null) {
// Consumimos los datos de la respuesta para liberar al cliente y poder hacer más peticiones
entity.consumeContent();
// Especificamos la url donde irán los datos al ejecutarse la acción SUBMIT junto con los datos de autentificación
// username y password se corresponden con el nombre de los fields en el formulario
HttpPost httppost = new HttpPost("http://www.spritmonitor.de/en/login.html?action=login&;username=username&password=password");
// Enviando parametros por httppost a la web.
// Aca segun lo que necesito, "Leer el foro" sobre lo del seniat, el parametro es:
// @params p_rif

ArrayList params = new ArrayList(2);
params.add(new BasicNameValuePair("username", "warrior4000")); // mi username // Prueben cambiando algo aca y ejecuten el codigo.
params.add(new BasicNameValuePair("password", "wMJHq4A")); // mi password
httppost.setEntity(new UrlEncodedFormEntity(params));
response = httpclient.execute(httppost);
System.out.println("Estado: " + response.getStatusLine());   
entity = response.getEntity();
if (entity != null) {
// Ya deberíamos estar autentificados, ahora podríamos acceder a cualquier parte del sitio web
// al que solo pueden acceder usuarios registrados
// Podríamos liberar el cliente...
entity.consumeContent();
// y acceder por ejemplo a la página de preferencias del usuario

/// Y aca es donde comienza el problema del parseo... es decir lo que quiero obtener del codigo html.
/// Leer el foro.
/// Supongo de aqui en adelante deberia usar Json, lamentablemente no me he documentado completo sobre Json.
HttpGet httpget2 = new HttpGet("http://www.spritmonitor.de/en/my_account.html");  // Aca ingresamos a my profile. por asi decirlo.
response = httpclient.execute(httpget2);
System.out.println("Estado " + response.getStatusLine()); 
entity = response.getEntity();           
if (entity != null) {
    // De aqui en adelante por favor leer mi pregunta en el foro.
    // Yo no se trabajar con Json y muchos dicen que es util para parsear codigo html, por ello les pido su ayuda.
InputStream instream = entity.getContent(); // Todo el codigo Html de la pagina.
String result= convertStreamToString(instream); // Leer el metodo convertStream mas abajo.
System.out.println("Datos: "+result); // Mandamos a imprimir en un sout. todo el codigo html
instream.close();
// Como hacer para obtener al menos el nombre y no todo el codigo html?, esa es una de mis necesidades -
// en lo que respecta a lo del seniat.
}

}
}          // Disculpen las except... me da flojera hacer unos propios en ejemplos :(.
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

    }

public static String convertStreamToString(InputStream is) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      StringBuilder sb = new StringBuilder();

      String line = null;
      try {
          while ((line = reader.readLine()) != null) {
              sb.append(line + "\n");
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              is.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      return sb.toString();
  }
}


METAS:
Por favor acepto cualquier ayuda, mi principal meta es enviar el rif a la web del seniat, conozco los parametros que este necesita.
Código (java) [Seleccionar]
// @param p_rif /* Este es el parametro que usan en la web del seniat y el que necesito enviar.

segundo* - Buscar un medio para capturar solo algo del cuerpo del html "Para obtener el nombre de la empresa en la web del seniat"... tengo pensado Json, cosa que aun no se utilizar.

tercero* - De aqui en adelante me encargo de todo lo demás, conectar a la bd, establecer parametros de busqued, ordenar los datos obtenidos, almacenarlos, etc... y ademas agradeceria mil veces al que me lograra ayudar con mis necesidades :)...
PD: agradezco al amigo legnak gracias por nombrarme el foro, :).

JNell

Jajaja Nvm... muchas gracias a aquellos "los que trataron de ayudarme en mi codigo" y los que no tambien por ver mi post  ::)

ya logre hacer justo lo que necesito al 200%.  ;-)

Solo me costo unas 32 hrs mas o menos de sueño con  :silbar:  ::)

PD: no use Json debido a que la misma pagina me generaba algunos errores
asi que utilize Jsoup... parseador html bastante completo y con javadoc integrado... los invito a probarlo no es complejo.  :rolleyes:

De esta forma no es por nada pero... les mando a decir a todos que no es imposible obtener datos del seniat sin tener la BD... "El que persevera, alcanza".

Suerte   ;)

neomatrix14

Hola, hermano estoy haciendo algo así para un cliente, y lo que veo es que usas una técnica de web scraping, pero en el caso de sitios web que para darte el resultado usan capcha. como veo es el caso del seniat, ¿como haces? yo lo quiero hacer usando java script o jquery. Saludos