2009-06-10 11 views
22

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

Ulteriori informazioni: autenticazione basata

  • Cookie.
  • Azione POST necessaria.

risposta

22

Faresti la richiesta come se avessi appena compilato il modulo. Supponendo che sia POST ad esempio, si effettua una richiesta POST con i dati corretti. Ora se non riesci ad accedere direttamente alla stessa pagina che vuoi analizzare, dovrai tracciare i cookie impostati dopo la tua richiesta di accesso e includerli nella richiesta di scraping per permetterti di rimanere loggato.

Potrebbe essere:

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.

+0

Grazie, questo sembra qualcosa che potrei usare, accetterò questa risposta se funziona quando torno alla programmazione. :-) –

+0

Funziona se la pagina Web è in HTML semplice, ma se il modulo viene generato dinamicamente tramite Javascript .... dovrebbe funzionare? – Souper

+0

@Souper probabilmente no; vorresti controllare a mano quali sarebbero le richieste che vanno dall'accesso alla pagina che vuoi analizzare e poi creare richieste che imitano quel comportamento. – dlamblin

0

È necessario utilizzare HTTPWebRequest e fare un POST. Questo link dovrebbe aiutarti a iniziare. La chiave è che devi visualizzare il modulo HTML della pagina che stai cercando di pubblicare per vedere tutti i parametri necessari al modulo per inviare il post.

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

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

+0

Sì, la parte più difficile che ho dimenticato di menzionare (perché è usata la maggior parte delle volte) è di conservare il cookie con me per la pagina successiva. –

5

È possibile utilizzare un controllo WebBrowser. Basta inserire l'URL del sito, quindi utilizzare il DOM per impostare il nome utente e la password nei campi corretti e infine inviare un clic al pulsante di invio. In questo modo non ti interessa nulla se non i due campi di input e il pulsante di invio. Nessuna gestione dei cookie, nessun parsing HTML grezzo, nessun sniffing HTTP - tutto ciò che viene fatto dal controllo del browser.

Se andate in questo modo, un paio di suggerimenti:

  1. È possibile impedire il controllo dal caricamento add-in come Flash - si potrebbe risparmiare un po 'di tempo.
  2. Una volta effettuato l'accesso, è possibile ottenere qualsiasi informazione necessaria dal DOM: non è necessario analizzare il codice HTML non elaborato.
  3. Se si desidera rendere lo strumento ancora più portabile nel caso in cui il sito cambi in futuro, è possibile sostituire la manipolazione DOM esplicita con un'iniezione di JavaScript. Il JS può essere ottenuto da una risorsa esterna, e una volta chiamato può fare la popolazione di campi e il submit.
+0

Il problema è che non riesco a creare un modulo per la GUI in questa parte dell'applicazione. –

+0

Beh, è ​​un peccato. se sei stanco di fare cose di basso livello, puoi provare a scrivere un'app GUI separata che verrà generata dalla tua app, eseguire lo scraping e comunicare i risultati. Ma è una specie di allungamento ... – eran

+0

@eran +1. La tua soluzione sembra più completa. – Souper

0

In aggiunta alla risposta dlambin E 'necessario avere

http.AllowAutoRedirect=false; 

Altrimenti

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

Farà un'altra richiesta iniziale URL e non sarà in grado di recuperare url2.

2

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

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

Questo ha funzionato molto bene, grazie. –

Problemi correlati