ASP.NET Ekran Zeskrobać post Symulacja

głosy
1

Próbuję pobrać i analizować HTML strony internetowej. Ostatnio, strona internetowa źródło przeniesiony z posiadania wszystkich informacji na jednej stronie w celu ukrycia jego część za javascript. Znajduje się pole wyboru „Pokaż wszystkie”, która wymaga aktywacji w celu przejrzenia całej strony.

Oto strona: Źródło strony

Zasadniczo szukam zautomatyzować pobieranie tej strony po pole wyboru został kliknięty. Obecnie mamy program w C, który pobiera stronę internetową i obsługuje naszą analizowania. Nie jestem pewien, czy można to zaakceptować JavaScript w URL, czy to może być wykorzystane, aby rozwiązać ten problem (Próbowałem za pomocą bookmarklet aby wywołać JavaScript z adresu URL, ale nie był w stanie zmusić go do obsługi pole wyboru), ale może obsługiwać pliki, jeśli łatwiej jest napisać program C #, który poradzi sobie z tym.

Wolałbym sposób kod tego sobie zamiast używania programu przez osoby trzecie, aby uniknąć konieczności instalowania czegokolwiek na serwerze ten biegnie dalej. Każda pomoc jest mile widziana.


Edit: Zasadniczo, w jaki sposób można zautomatyzować wywołanie javascript, który jest powiązany że „Zaznacz wszystko” pole wyboru, więc mogę chwycić strona html zawierający wszystko to, który jest wyświetlany po kliknięciu na pole.


Edycja 2: Tutaj jest wyjście z Fiddler2:

__EVENTTARGET ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox
__EVENTARGUMENT
__LASTFOCUS
__VIEWSTATE (REMOVED DUE TO LENGTH)
__EVENTVALIDATION (REMOVED DUE TO LENGTH)
ctl00$ContentPlaceHolder1$GenericWebUserControl$Organization0 ALL
ctl00$ContentPlaceHolder1$GenericWebUserControl$Initial or Amendment1 ALL
ctl00$ContentPlaceHolder1$GenericWebUserControl$Relief Requested2 ALL
ctl00$ContentPlaceHolder1$GenericWebUserControl$Country3 ALL
ctl00$ContentPlaceHolder1$GenericWebUserControl$Status4 ALL
ctl00$ContentPlaceHolder1$GenericWebUserControl$StartDate5  
ctl00$ContentPlaceHolder1$GenericWebUserControl$EndDate5    
ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox on

Jestem obecnie na 500 błędów serwera. Czy muszę to wszystko z tych GenericWebUserControls na żądanie POST, jak również? Również muszę zawierać EVENTVALIDATION?


EDIT 3: Oto najnowszy kod. Ja wciąż się serwerowi 500 błędów.

private void CreateRequest()
{
    HttpWebRequest httpWebRequest;
    HttpWebResponse httpWebResponse;
    StreamWriter streamWriter;
    Stream webResponseStream;
    StreamReader streamReader;
    string postData;
    string outputHTML;

    postData = String.Format(&__EVENTTARGET={0} + &__VIEWSTATE={1} + &__EVENTVALIDATION=(2)+&ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox=on +&ctl00$ContentPlaceHolder1$GenericWebUserControl$Organization0=ALL +&ctl00$ContentPlaceHolder1$GenericWebUserControl$Initial+or+Amendment1=ALL +&ctl00$ContentPlaceHolder1$GenericWebUserControl$Relief+Requested2=ALL +&ctl00$ContentPlaceHolder1$GenericWebUserControl$Country3=ALL +&ctl00$ContentPlaceHolder1$GenericWebUserControl$Status4=ALL,EVENTTARGET, VIEWSTATE, EVENTVALIDATION);

    httpWebRequest = (HttpWebRequest)WebRequest.Create(http://services.cftc.gov/sirt/sirt.aspx?Topic=ForeignPart30Exemptions);
    httpWebRequest.Method = POST;
    httpWebRequest.ContentType = application/x-www-form-urlencoded;
    httpWebRequest.ContentLength = postData.Length;

    streamWriter = new StreamWriter(httpWebRequest.GetRequestStream(), System.Text.Encoding.ASCII);
    streamWriter.Write(postData);
    streamWriter.Close();

    httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    webResponseStream = httpWebResponse.GetResponseStream();
    streamReader = new StreamReader(webResponseStream);
    outputHTML = streamReader.ReadToEnd();

    Console.WriteLine(outputHTML);
}

EDIT 4: I stwierdziliśmy, że jest to ciąg postData który jest przyczyną błędu serwer 500. Jeśli mi się uda pusty ciąg, wyprowadza całą stronę. Czy ktoś wie, czy jestem poprawna posiadaniem umieścić wszystko, co było od Fiddler2 który miał wartość w ciągu postData? Również, że __VIEWSTATE jest niezwykle długi łańcuch. Czy ogranicza ani niczego nie jestem pewien?


EDIT 5: Pobiegłem wszystkich ciągów stosowanych w postData przez kodera URL, ale nadal jestem coraz serwera 500 błędów. Czy jest jakiś sposób dla mnie do debugowania dlatego, że ciało post jest nieważny?


ROZWIĄZANIE: Ok, nie mogłem dostać mój postData ciąg poprawne, ale kiedy wklejony w surowym ciała POST działa. To wygląda jak to będzie na tyle dobry, ale moim problemem jest to, czy będzie kontynuować pracę.

Utwórz 23/07/2009 o 16:16
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
3

To postać strony asp.net. Kliknięcie pola wyboru powoduje, że strona zostanie zamieszczona z powrotem do serwera. Więc zamiast próbować symulować JavaScript, co chcesz zrobić, a nie ma symulować żądania POST.

To jest notorycznie trudne ze stron ASP.NET, ponieważ zwykle trzeba wypełnić ukryte wejście __ViewState. Polecam przy użyciu sniffer pakietów jak Skrzypek , aby zobaczyć rzeczywisty wniosek, jak to jest wysłana. Powinieneś być w stanie skopiować ViewState stamtąd.

Odpowiedział 23/07/2009 o 16:22
źródło użytkownik

głosy
1

To wygląda JavaScript inicjuje pocztą na tej samej stronie. Firebug pokazuje następujących danych POST.

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox

To chyba dobre miejsce do rozpoczęcia poszukiwań.

Odpowiedział 23/07/2009 o 16:25
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more