2009-06-10 17 views

Odpowiedz

22

Złożyłabyś wniosek tak, jakbyś właśnie wypełnił formularz. Zakładając, że jest to POST, na przykład, wysyłasz żądanie POST z poprawnymi danymi. Jeśli nie możesz zalogować się bezpośrednio na tę samą stronę, którą chcesz zeskanować, będziesz musiał śledzić ustawienia plików cookie po zgłoszeniu logowania i uwzględnić je w żądaniu skrobania, aby pozostać zalogowanym.

Może wyglądać następująco:

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; 

Może.

+0

Dziękuję, wygląda to na coś, z czego mógłbym skorzystać, przyjmuję tę odpowiedź, jeśli zadziała, gdy wrócę do programowania. :-) –

+0

Działa to, jeśli strona jest w zwykłym HTML, ale jeśli formularz jest dynamicznie generowany przez JavaScript .... czy to działa? – Souper

+0

@Souper prawdopodobnie nie; chciałbyś ręcznie sprawdzić, jakie będą żądania od logowania do strony, którą chcesz zeskanować, a następnie tworzyć żądania, które naśladują to zachowanie. – dlamblin

0

Musisz użyć HTTPWebRequest i wykonać test POST. Ten link powinien pomóc Ci zacząć. Kluczowe jest to, że musisz spojrzeć na formularz HTML strony, którą próbujesz opublikować, aby zobaczyć wszystkie parametry potrzebne do przesłania postu.

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

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

+0

Tak, najtrudniejszą częścią, o której zapomniałem wspomnieć (ponieważ jest używana przez większość czasu) jest trzymanie ciasteczka ze mną na następnej stronie. –

5

Można użyć kontrolę WebBrowser. Wystarczy podać adres URL witryny, a następnie użyć DOM, aby ustawić nazwę użytkownika i hasło w odpowiednich polach, a następnie wysłać przycisk "Wyślij". W ten sposób nie dbasz o nic poza dwoma polami wprowadzania i przyciskiem przesyłania. Bez obsługi plików cookie, bez surowego analizowania kodu HTML, bez sniffowania HTTP - wszystko to odbywa się za pomocą formantu przeglądarki.

Jeśli przejść tę drogę, jeszcze kilka sugestii:

  1. można zapobiec kontrolę od załadunku Dodać-ins, takich jak Flash - można zaoszczędzić trochę czasu.
  2. Po zalogowaniu można uzyskać wszelkie potrzebne informacje z DOM - nie trzeba analizować surowego HTML.
  3. Jeśli chcesz, aby narzędzie było jeszcze bardziej przenośne, jeśli witryna zmieni się w przyszłości, możesz zastąpić jawną manipulację DOM wtryskiem JavaScript. JS można uzyskać z zewnętrznego zasobu, a po wywołaniu może on wykonać populację pól i przesłać.
+0

Problem polega na tym, że nie mogę utworzyć formularza GUI w tej części aplikacji. –

+0

Cóż, szkoda. jeśli czujesz się zmęczony robieniem rzeczy niskiego poziomu, możesz spróbować napisać osobną aplikację GUI, która zostanie utworzona z aplikacji, wykona skrobanie i przekaże wyniki z powrotem. Ale to rodzaj odcinka ... – eran

+0

@eran +1. Twoje rozwiązanie wygląda bardziej kompletnie. – Souper

0

Jako dodatek do dlambin odpowiedź Konieczne jest, aby mieć

http.AllowAutoRedirect=false; 

Inaczej

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

To sprawi kolejną prośbę do początkowego URL i nie będzie w stanie odzyskać url2.

2

W niektórych przypadkach httpResponse.Cookies będzie puste. Zamiast tego użyj 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

To zadziałało naprawdę dobrze, dziękuję. –

Powiązane problemy