Pregunta

Necesito automatizar un proceso que involucra un sitio web que utiliza un formulario de inicio de sesión.Necesito capturar algunos datos en las páginas que siguen a la página de inicio de sesión.

Sé cómo raspar la pantalla de páginas normales, pero no de aquellas que se encuentran detrás de un sitio seguro.

  1. ¿Se puede hacer esto con la clase .NET WebClient?
    • ¿Cómo iniciaría sesión automáticamente?
    • ¿Cómo mantendría la sesión iniciada en las otras páginas?
¿Fue útil?

Solución

Una forma sería automatizar un navegador; usted mencionó WebClient, así que supongo que podría estar refiriéndose a WebClient en .NET.

Dos puntos principales:

  • No hay nada especial en https relacionado con WebClient: simplemente funciona
  • Las cookies se utilizan normalmente para llevar a cabo la autenticación; deberás capturarlas y reproducirlas.

Estos son los pasos que seguiría:

  1. OBTÉN el formulario de inicio de sesión, captura la cookie en la respuesta.
  2. Usando Xpath y HtmlAgilityPack, busque los nombres y valores de los campos "tipo de entrada = oculto".
  3. PUBLICAR para iniciar sesión en la acción del formulario con nombre de usuario, contraseña y valores de campo ocultos en el cuerpo de la solicitud.Incluya la cookie en los encabezados de la solicitud.Nuevamente, capture la cookie en la respuesta.
  4. OBTÉN las páginas que deseas, nuevamente, con la cookie en los encabezados de solicitud.

En el paso 2, menciono un método algo complicado para automatizar el inicio de sesión.Por lo general, puede publicar con nombre de usuario y contraseña directamente en la acción del formulario de inicio de sesión conocido sin obtener el formulario inicial ni transmitir los campos ocultos.Algunos sitios tienen validación de formulario (diferente de la validación de campo) en sus formularios, lo que hace que este método no funcione.

HtmlAgilidadPack es una biblioteca .NET que le permite convertir HTML mal formado en un XmlDocument para que pueda realizar XPath sobre él.Bastante útil.

Finalmente, puede encontrarse con una situación en la que el formulario dependa de una secuencia de comandos del cliente para modificar los valores del formulario antes de enviarlo.Es posible que necesite simular este comportamiento.

Usar una herramienta para ver el tráfico http para este tipo de trabajo es extremadamente útil. Lo recomiendo. es decirHttpHeaders, Violinista, o insecto de fuego (pestaña neta).

Otros consejos

Puede simular fácilmente la entrada del usuario.Puede enviar el formulario en la página web de su programa enviando una solicitud post\get a un sitio web.
El formulario de inicio de sesión típico se ve así:

<form name="loginForm" method="post" Action="target_page.html">
   <input type="Text" name="Username">
   <input type="Password" name="Password">
</form>

Puede enviar una solicitud de publicación al sitio web proporcionando valores para los campos de Nombre de usuario y Contraseña.Lo que sucede después de enviar su solicitud depende en gran medida del sitio web; por lo general, será redirigido a alguna página.Su información de autorización se almacenará en las sesiones\cookie.Entonces, si el cliente raspado puede mantener la sesión web/comprende las cookies, podrá acceder a páginas protegidas.

En su pregunta no queda claro qué idioma/marco va a utilizar.Por ejemplo, existe un marco para el raspado de pantalla (incluida la función de inicio de sesión) escrito en perl: WWW::Mecanizar

Tenga en cuenta que puede enfrentar algunos problemas si el sitio en el que intenta iniciar sesión utiliza scripts Java o algún tipo de CAPTCHA.

¿Puedes por favor aclarar?¿La clase WebClient de la que habla es la de HTTPUnit/Java?

Si es así, su sesión debería guardarse automáticamente.

En su pregunta no queda claro a qué clase (o idioma) de WebClient se refiere.

Si tiene Java Runtime, puede utilizar la clase Apache HttpClient;aquí hay un ejemplo que escribí usando Groovy que accede a la deliciosa API a través de SSL:

   def client = new HttpClient()

   def credentials = new UsernamePasswordCredentials( "username", "password" )
   def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
   client.getState().setCredentials( authScope, credentials )

   def url = "https://api.del.icio.us/v1/posts/get"

   def method = new PostMethod( url )
   method.addParameter( "tag", tag )
   client.executeMethod( method )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top