ASP.NET Screen Scrape bericht simuleren

stemmen
1

Ik probeer te downloaden en te ontleden de HTML van een webpagina. Onlangs heeft de website van de bron verplaatst van het hebben van al hun informatie op een pagina om een ​​deel van het achter javascript te verbergen. Er is een Show All selectievakje moet worden geactiveerd om de hele pagina te bekijken.

Hier is de website: Source Website

In principe Ik ben op zoek voor het automatiseren van het ophalen van die pagina na het selectievakje is geklikt. Momenteel hebben we een C-programma dat de webpagina downloadt en behandelt onze parsing. Ik weet niet zeker of het javascript kunnen accepteren in de URL als dat kan worden gebruikt om dit probleem op te lossen (ik heb geprobeerd met behulp van een bookmarklet aan de javascript uit de URL te bellen, maar ik was niet in staat om het te krijgen op de te behandelen selectievakje), maar het kan bestanden verwerken als het gemakkelijker is om een ​​C # programma dat dit aankan schrijven.

Ik zou een manier vinden om dit zelf te coderen in plaats van gebruik maken van een programma van derden om te voorkomen dat iets te hoeven installeren op de server deze draait op de voorkeur. Alle hulp wordt zeer gewaardeerd.


Edit: In principe, hoe kan ik de oproep om de javascript die is gekoppeld aan die automatiseren Select All checkbox zodat ik pak de HTML-pagina met daarin alles is dat wordt weergegeven na het klikken.


Bewerken 2: Hier is de output van 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

Ik ben momenteel het krijgen van 500 FOUTEN van de server. Moet ik al die GenericWebUserControls in de post onder andere ook? Ook heb ik nodig om de EVENTVALIDATION bevatten?


EDIT 3: Hier is het laatste code. Ik ben nog steeds server 500 fouten.

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: Ik heb vastgesteld dat het de postData string die de oorzaak van de server 500-fout. Als ik maak er een lege string, maar voert de hele webpagina. Weet iemand of ik juist in het hebben van alles wat uit Fiddler2 dat een waarde in de postData snaar had kwam zetten ben? Ook dat __VIEWSTATE is een ongelooflijk lange reeks. Zijn er grenzen of wat ik ben niet zeker over?


EDIT 5: Ik liep alle snaren gebruikt in postData via een URL encoder, maar ik ben nog steeds server 500 fouten. Is er een manier voor mij om te debuggen waarom die post lichaam ongeldig is?


OPLOSSING: Ok, ik kon niet mijn postData snaar correct, maar toen ik geplakt in het ruwe POST lichaam werkt. Dit ziet eruit als het genoeg goed zal zijn, maar mijn zorg is of dit zal blijven werken.

De vraag is gesteld op 23/07/2009 om 16:16
bron van user
In andere talen...                            


2 antwoorden

stemmen
3

Dat is een asp.net pagina. Klikken zorgt ervoor dat de pagina terug naar de server worden geplaatst. Dus in plaats van te proberen om het javascript wat je wilt doen in plaats simuleren is simuleren de post aanvraag.

Dit is notoir lastig met ASP.Net pagina's, omdat je meestal nodig hebt om de verborgen __VIEWSTATE ingang bevolken. Ik raad het gebruik van een packet sniffer zoals Fiddler om de werkelijke verzoek te zien zoals het wordt verzonden. Je moet in staat zijn om de ViewState kopiëren vanaf daar.

antwoordde op 23/07/2009 om 16:22
bron van user

stemmen
1

Het lijkt de JavaScript initieert een POST naar dezelfde pagina. Firebug toont het volgende in de POST data.

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox

Dat is waarschijnlijk een goede plek om te beginnen kijken.

antwoordde op 23/07/2009 om 16:25
bron van user

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