2013-04-25 8 views
5

Próbuję zeskrobać a website, aby uzyskać informacje o Textarea.Skrobanie strony internetowej, aby uzyskać nazwę elementu i identyfikator poprzez przeglądarkę C#

Używam:

HtmlDocument doc = this.webBrowser1.Document; 

Kiedy patrzę na źródła widoku pokazuje <textarea name="message" class="profile">

Ale gdy próbuję uzyskać dostęp do tego textarea z:

HtmlDocument doc = this.webBrowser1.Document; 

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

To pokazuje błąd:

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

Jakaś pomoc?

+3

POF warunki użytkowania nie pozwalają skrobanie. – albattran

+0

Użyj swojego debuggera i przejdź przez kod. Umieść punkt przerwania w linii 'doc.GetElementsByTagName (.... ', a następnie sprawdź, co jest zwracane przez element' GetElementsByTagName ("textarea") '. Czy zawiera element' message'? Czy jest to tablica lub po prostu jeden element: – NotMe

+0

@ Chrześcijanin Widzę nadawcę {wiadomość} i podstawową {wiadomość}? – IceDawg

Odpowiedz

2

dla bieżącej trzeba po prostu użyć tego:

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

przypadku skomplikowanych rzeczy można użyć klasy HTMLDocument z klasą MSHTML.

+0

@ Skumar Wciąż dostaję ten sam błąd – IceDawg

+0

@ Skumar możemy porozmawiać? – IceDawg

1

Mogę Ci powierzyć HtmlAgilityPack!

Chciałbym myśleć, że próbujesz uzyskać dostęp do strony internetowej, która używa plików cookie do określenia, czy użytkownik jest zalogowany (lub nie). Jeśli nie, wymusi rejestrację/zalogowanie się, inaczej nie wolno ci nic zobaczyć. Czy mam rację?

Twoja przeglądarka zapisuje pliki cookie, twoje C# nie! (ogólnie mówiąc)
Musisz utworzyć pojemnik z plikami cookie, aby rozwiązać ten problem.

Twoja C# -App może zalogować się, zażądać pliku cookie/sesji, może pobrać pliki cookie z głowicy reakcyjnej, a następnie powinieneś być w stanie zeskrobać profile lub cokolwiek zechcesz.
Uzyskaj dane pocztowe, które są wysyłane na serwer. Możesz użyć narzędzi/dodatków, takich jak Fiddler, Sabotaż, itp.

E.g. PostdataString: nazwa_użytkownika = testuser & hasło = TESTPASSWORD & language = pl & akcja% 3Asubmit = Zatwierdź

Oto fragment można użyć.

 //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(); 

Będziesz musiał dostosować parametry Cookie pomiędzy i dodać swój bieżący identyfikator sesji również do kodu. To zależy od żądanej strony internetowej, którą odwiedzasz.
np .:

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

Nie rozumiem anythjing – IceDawg

Powiązane problemy