ASP.NET Screen Scrape post Simulate

voturi
1

Am încercat să descărcați și analiza HTML al unei pagini web. Recent, site-ul sursa sa mutat de a avea toate informațiile lor pe o singură pagină pentru a ascunde o parte din ea în spatele JavaScript. Există o „Arată tot“ caseta de selectare care are nevoie activat pentru a putea vizualiza întreaga pagină.

Iată site - ul: Source site -

În esență, eu sunt în căutarea de a automatiza recuperarea după pagina caseta de selectare a fost făcut clic. În prezent, avem un program C, care descarcă pagina web și se ocupă de parsare noastre. Nu sunt sigur dacă acesta poate accepta JavaScript în URL-ul în cazul în care poate fi utilizată pentru a rezolva această problemă (am încercat, folosind un bookmarklet pentru a apela javascript din URL-ul, dar nu am fost în stare să-l să se ocupe de check box), dar se poate ocupa de fișiere în cazul în care este mai ușor de a scrie un program C # care se poate ocupa de acest lucru.

Aș prefera o modalitate de a coda acest lucru eu însumi în loc să utilizeze un program de terță parte pentru a evita să instalați nimic pe server ruleaza pe acest. Orice ajutor este foarte apreciat.


Editare: Practic, cum pot automatiza apelul la JavaScript care este legată de faptul că „Select All“ caseta de selectare , astfel că pot apuca pagina HTML care conține totul e care este afișată după ce faceți clic pe caseta.


Edit 2: Iată de ieșire de la 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

Primesc în prezent 500 de ERORI de pe server. Am nevoie pentru a include toate aceste GenericWebUserControls în cererea de post, precum? De asemenea, am nevoie pentru a include EVENTVALIDATION?


EDIT 3: Iată cele mai recente cod. Sunt încă obtinerea de server 500 de erori.

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: Am stabilit că este șirul de POSTDATA care cauzează eroarea de server 500. Dacă am face un șir gol, va fi afișat întreaga pagina web. Stie cineva dacă sunt corect în a avea de a pune tot ce a venit de la Fiddler2 care a avut o valoare în șirul POSTDATA? De asemenea, că __VIEWSTATE este un șir incredibil de lung. Există limite sau ceva nu sunt sigur?


EDIT 5: am fugit toate șirurile folosite în POSTDATA printr - un encoder URL - ul, dar eu sunt încă obtinerea de server 500 de erori. Există vreo modalitate pentru mine pentru a depana de ce acest organism post este nevalid?


SOLUȚIE: Ok, nu am putut obține șirul meu POSTDATA corect, dar când am inserat în corpul POST brut funcționează. Acest lucru se pare ca va fi destul de bun, dar preocuparea mea este dacă acest lucru va continua să lucreze.

Întrebat 23/07/2009 la 16:16
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
3

Asta este o pagină de asp.net. Dacă faceți clic pe caseta face ca pagina să fie postate înapoi la server. Deci, mai degrabă decât încercarea de a simula javascript ceea ce vrei sa faci in schimb este simula cererea post.

Acest lucru este de notorietate dificil , cu pagini de ASP.Net, pentru că aveți nevoie , de obicei , pentru a popula intrarea __ViewState ascunsă. Vă recomandăm să utilizați un pachet sniffer cum ar fi Scripcarul pentru a vizualiza cererea reală așa cum este trimis. Tu ar trebui să poată copia Viewstate de acolo.

Publicat 23/07/2009 la 16:22
sursa de către utilizator

voturi
1

Se pare JavaScript inițiază un POST la aceeași pagină. Firebug arată următoarele în datele POST.

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox

Asta e, probabil, un loc bun pentru a începe căutarea.

Publicat 23/07/2009 la 16:25
sursa de către utilizator

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