2013-04-25 17 views
5

Sto provando a racimolare a website per ottenere le informazioni Textarea.Scraping un sito Web per ottenere il nome dell'elemento e l'id tramite il browser Web C#

sto usando:

HtmlDocument doc = this.webBrowser1.Document; 

Quando guardo la fonte vista mostra <textarea name="message" class="profile">

Ma quando provo ad accedere a questa textarea con:

HtmlDocument doc = this.webBrowser1.Document; 

doc.GetElementsByTagName("textarea") 
     .GetElementsByName("message")[0] 
     .SetAttribute("value", "Hello"); 

mostra il errore:

Value of '0' is not valid for 'index'. 'index' should be between 0 and -1. 
Parameter name: index 

Qualsiasi aiuto?

+3

POF termini di utilizzo non consente raschiatura. – albattran

+0

Usa il tuo debugger e passa attraverso il codice. Metti un punto di interruzione sulla linea 'doc.GetElementsByTagName (....'. Poi controlla cosa viene restituito dal pezzo 'GetElementsByTagName (" textarea "). Contiene un elemento' message'? È un array o solo un singolo elemento – NotMe

+0

@ChrisLively Vedo mittente {messaggio} e base {messaggio}? – IceDawg

risposta

2

Per la vostra attuale necessità si può semplicemente utilizzare questo:

doc.GetElementsByTagName("textarea")[0].InnerText = "Hello"; 

Per le cose complesse è possibile utilizzare classe HtmlDocument con classe di MSHTML.

+0

@ skumar Ho ancora lo stesso errore – IceDawg

+0

@ skumar possiamo chattare? – IceDawg

1

Posso affidarti HtmlAgilityPack!

Mi piacerebbe pensare che si tenta di accedere a un sito Web che utilizza i cookie per determinare se un utente è connesso (o meno). In caso contrario, ti costringerà a registrarti/accedere altrimenti non ti è permesso vedere nulla. Ho ragione?

Il tuo browser memorizza i cookie, il tuo C# no! (in senso lato)
È necessario creare un contenitore di cookie per risolvere il problema.

Il tuo C# -App può accedere, richiedere un cookie/sessione, può prelevare i cookie dal responseheader e quindi dovresti essere in grado di grattare i profili o qualsiasi altra cosa desideri.
Ottieni i dati del post, che viene inviato al server. È possibile utilizzare strumenti/addon come Fiddler, Tamper, ecc.

E.g. PostdataString: user_name = TESTUSER & password = testpassword & language = it & azione% 3Asubmit = Invia

Ecco un frammento è possibile utilizzare.

 //Create the PostData 
     string strPostData = "user_name=" + txtUser.Text + "&password=" + txtPass.Text + "&language=en&action%3Asubmit=Submit"; 
     CookieContainer tempCookies = new CookieContainer(); 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] data = encoding.GetBytes(strPostData); 

     //Create the Cookie 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.website.com/login.php"); 
     request.Method = "POST"; 
     request.KeepAlive = true; 
     request.AllowAutoRedirect = false; 
     request.Accept = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.Referer = "http://www.website.com/login.php"; 
     request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1"; 
     request.ContentLength = data.Length; 

     Stream requestStream = request.GetRequestStream(); 
     requestStream.Write(data, 0, data.Length); 

     HttpWebResponse response; 
     response = (HttpWebResponse)request.GetResponse(); 
     string sRequestHeaderBuffer = Convert.ToString(response.Headers); 

     requestStream.Close(); 

     //Stream(-output) of the new website 
     StreamReader postReqReader = new StreamReader(response.GetResponseStream()); 

     //RichTextBox to see the new source. 
     richTextBox1.Text = postReqReader.ReadToEnd(); 

Sarà necessario regolare i cookie parametri in mezzo e aggiungere l'aswell sessionid corrente al codice. Questo dipende dal sito Web richiesto che visiti.
es .:

 request.Headers.Add("Cookie", "language=en_US.UTF-8; StationID=" + sStationID + "; SessionID=" + sSessionID); 
+1

Non capisco niente – IceDawg