Domanda

Ho bisogno di alcune informazioni da un sito web che non è mio, al fine di ottenere queste informazioni ho bisogno di accedere al sito web per raccogliere le informazioni, questo avviene attraverso un modulo HTML. Come posso fare questo screenscaping autenticato in C #?

Ulteriori informazioni:

  • autenticazione basata su cookie.
  • azione POST necessari.
È stato utile?

Soluzione

Saresti la richiesta come se si era appena compilato il modulo. Supponendo che è POST, ad esempio, si effettua una richiesta POST con i dati corretti. Ora, se non è possibile accedere direttamente alla stessa pagina che si desidera raschiare, si dovrà tenere traccia di tutto ciò che i cookie sono impostati dopo la richiesta di accesso, e includerli nella richiesta raschiatura per consentire di rimanere collegato.

Potrebbe sembrare:

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;

Forse.

Altri suggerimenti

È possibile utilizzare il controllo di un browser web . Basta alimentarlo l'URL del sito, quindi utilizzare il DOM per impostare il nome utente e la password nei campi giusti, ed eventualmente inviare un clic per il pulsante di invio. In questo modo non si cura di nulla, ma i due campi di input e il pulsante di invio. No gestione dei cookie, non parsing del codice HTML grezzo, non HTTP sniffing -. Tutto ciò che è fatto da controllo del browser

Se si va in questo modo, un paio di suggerimenti:

  1. È possibile impedire che il controllo dal caricamento add-in come Flash - potrebbe risparmiare un po 'di tempo
  2. .
  3. Una volta effettuato il login, è possibile ottenere tutte le informazioni che vi interessa dal DOM -. Non c'è bisogno di analizzare HTML grezzo
  4. Se si desidera rendere lo strumento ancora più portatile nel caso in cui le modifiche al sito in futuro, è possibile sostituire la manipolazione del DOM esplicito con un'iniezione di JavaScript. I JS possono essere ottenuti da una risorsa esterna, e una volta chiamato può fare la popolazione campi e inviare.

In alcuni casi, httpResponse.Cookies sarà vuoto. Utilizzare la CookieContainer invece.

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;

In aggiunta alla risposta dlambin E 'necessario avere

http.AllowAutoRedirect=false;

In caso contrario

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

Si farà una nuova richiesta a siglare URL e non sarà in grado di recuperare url2.

È necessario utilizzare il HttpWebRequest e fare un post. Questo collegamento dovrebbe aiutare a iniziare. La chiave è, è necessario guardare al form HTML della pagina che si sta cercando di inviare da a vedere tutti i parametri del modulo ha bisogno per poter inserire post.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top