ASP.NET Screen Skrap Post Simuler

stemmer
1

Jeg prøver å laste ned og analysere HTML på en nettside. Nylig flyttet kilden nettstedet fra å ha all sin informasjon på en side for å skjule en del av det bak javascript. Det er en Show All boksen som må aktiveres for å se hele siden.

Her er nettsiden: Source Hjemmeside

Hovedsak Jeg ønsker å automatisere hente den siden etter at boksen har blitt klikket. Foreløpig har vi et C-program som laster ned nettsiden og håndterer vår analyse. Jeg er ikke sikker på om det kan godta Javascript i nettadressen hvis det kan brukes til å løse dette problemet (jeg har prøvd å bruke en bookmarklet å ringe javascript fra nettadressen, men jeg var ikke i stand til å få det til å håndtere kryss), men den kan håndtere filer hvis det er lettere å skrive et C # program som kan håndtere dette.

Jeg foretrekker en måte å kode dette selv i stedet for å bruke en tredjeparts program for å unngå å måtte installere noe på serveren denne kjører på. Alle hjelpe er verdsatt.


Edit: I utgangspunktet, hvordan kan jeg automat kallet til Javascript som er knyttet til at Select All boksen slik at jeg kan ta tak i html-side som inneholder alt er som vises når du klikker på boksen.


Rediger 2: Her er resultatet fra 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

Jeg er for tiden får 500 feil fra serveren. Trenger jeg å inkludere alle disse GenericWebUserControls i posten forespørsel samt? Også jeg må gjøre for å inkludere EVENTVALIDATION?


EDIT 3: Her er den nyeste koden. Jeg er fortsatt å få serveren 500 feil.

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: Jeg har funnet ut at det er den POST strengen som forårsaker serveren 500-feil. Hvis jeg gjør det en tom streng, sender det hele nettsiden. Vet noen om jeg er riktig i å måtte sette alt som kom fra Fiddler2 som hadde en verdi i POST streng? Dessuten er det __VIEWSTATE en utrolig lang streng. Er det grenser eller noe jeg er ikke sikker på om?


EDIT 5: Jeg kjørte alle strengene som brukes i POST gjennom en URL koder, men jeg er fremdeles får server 500 feil. Er det noen måte for meg å feilsøke hvorfor det innlegget kroppen er ugyldig?


LØSNING: Ok, jeg kunne ikke få min POST streng riktig, men når jeg limt inn i rå POST kroppen fungerer. Dette ser ut som det vil være bra nok, men min bekymring er om dette vil fortsette å arbeide.

Publisert på 23/07/2009 klokken 15:16
kilden bruker
På andre språk...                            


2 svar

stemmer
3

Det er en asp.net side. Ved å klikke på boksen gjør at siden å bli lagt tilbake til serveren. Så heller enn å prøve å simulere javascript hva du vil gjøre i stedet er å simulere innlegget forespørsel.

Dette er notorisk vanskelig med ASP.NET-sider, fordi du vanligvis trenger å fylle den skjulte __ViewState inngang. Jeg anbefaler å bruke en pakke sniffer som Fiddler å vise den faktiske forespørselen som det er sendt. Du bør være i stand til å kopiere Visningsstatusen derfra.

Svarte 23/07/2009 kl. 15:22
kilden bruker

stemmer
1

Det ser Javascript initierer en POST til samme side. Firebug viser følgende melding i POST-dataene.

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox

Det er sannsynligvis et godt sted å begynne å lete.

Svarte 23/07/2009 kl. 15:25
kilden bruker

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