2009-06-10 13 views

Respuesta

22

Realiza la solicitud como si acabara de completar el formulario. Suponiendo que es POST, por ejemplo, realiza una solicitud POST con los datos correctos. Ahora bien, si no puede iniciar sesión directamente en la misma página que desea raspar, tendrá que rastrear las cookies que se establecieron después de su solicitud de inicio de sesión e incluirlas en su solicitud de raspado para permitirle permanecer conectado.

Puede verse como:

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 
http.CookieContainer = new CookieContainer(); 
http.CookieContainer.Add(httpResponse.Cookies); 
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 

Maybe.

+0

Gracias, esto parece algo que podría usar, aceptaré esta respuesta si funciona cuando regrese a la programación. :-) –

+0

Esto funciona si la página web está en HTML simple, pero si el formulario se genera dinámicamente a través de Javascript ... ¿funcionaría esto? – Souper

+0

@Souper probablemente no; desearía inspeccionar a mano cuáles serían las solicitudes desde el inicio de sesión hasta la página que desea raspar y luego generar solicitudes que imiten ese comportamiento. – dlamblin

0

Debe usar HTTPWebRequest y hacer una POST. Este enlace debería ayudarlo a comenzar. La clave es que debes mirar el formulario HTML de la página desde la que intentas publicar para ver todos los parámetros que el formulario necesita para poder enviar la publicación.

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

+0

Sí, la parte más difícil que olvidé mencionar (porque se usa la mayoría de las veces) es guardarme la cookie para la próxima página. –

5

Puede utilizar un control WebBrowser. Solo publíquelo en la URL del sitio, luego use el DOM para configurar el nombre de usuario y la contraseña en los campos correctos, y eventualmente envíe un clic al botón de enviar. De esta forma, no le importa nada más que los dos campos de entrada y el botón de enviar. Sin manejo de cookies, sin análisis HTML en bruto, sin detección de HTTP: todo eso lo hace el control del navegador.

Si vas de esa manera, algunas sugerencias más:

  1. Puede evitar que el control de carga de complementos como Flash - se puede ahorrar algo de tiempo.
  2. Una vez que inicie sesión, puede obtener la información que necesita del DOM, sin necesidad de analizar el HTML sin formato.
  3. Si desea que la herramienta sea aún más portátil en caso de que el sitio cambie en el futuro, puede reemplazar su manipulación DOM explícita con una inyección de JavaScript. El JS se puede obtener de un recurso externo, y una vez llamado puede hacer los campos población y enviar.
+0

El problema es que no puedo crear un formulario GUI en esta parte de la aplicación. –

+0

Bueno, eso es muy malo. Si te cansas de hacer las cosas de bajo nivel, puedes intentar escribir una aplicación GUI separada que se generará desde tu aplicación, hacer el borrado y comunicar los resultados. Pero eso es un poco exagerado ... – eran

+0

@eran +1. Tu solución parece más completa. – Souper

0

Como una adición a dlambin respuesta Es necesario tener

http.AllowAutoRedirect=false; 

De lo contrario

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

Hará otra petición a la URL inicial y no será capaz de recuperar url2.

2

En algunos casos, httpResponse.Cookies estará en blanco. Use el CookieContainer en su lugar.

CookieContainer cc = new CookieContainer(); 

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest; 
http.KeepAlive = true; 
http.Method = "POST"; 
http.ContentType = "application/x-www-form-urlencoded"; 

http.CookieContainer = cc; 

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword; 
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
http.ContentLength = dataBytes.Length; 
using (Stream postStream = http.GetRequestStream()) 
{ 
    postStream.Write(dataBytes, 0, dataBytes.Length); 
} 
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 
// Probably want to inspect the http.Headers here first 
http = WebRequest.Create(url2) as HttpWebRequest; 

http.CookieContainer = cc; 

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 
+0

Esto funcionó muy bien, gracias. –

Cuestiones relacionadas