ASP.NET Screen Scrape post Simuler

voix
1

Je suis en train de télécharger et d'analyser le code HTML d'une page Web. Récemment, le site source déplacé d'avoir toutes leurs informations sur une page pour cacher une partie de derrière javascript. Il y a une case à cocher « Afficher tous » qui doit être activé pour afficher la page.

Voici le site: Site Web Source

Essentiellement, je suis à la recherche d'automatiser la récupération après cette page la case à cocher a été cliqué. À l'heure actuelle, nous avons un programme C qui télécharge la page Web et gère notre analyse. Je ne sais pas si elle peut accepter javascript dans l'URL si cela peut être utilisé pour résoudre ce problème (je l'ai essayé d'utiliser un bookmarklet pour appeler le javascript de l'URL, mais je n'ai pas pu l'obtenir pour gérer la cocher la case), mais il peut gérer des fichiers s'il est plus facile d'écrire un programme C # qui peut gérer cela.

Je préférerais un moyen de coder moi-même plutôt que d'utiliser un programme tiers pour éviter d'avoir à installer quoi que ce soit sur le serveur fonctionne sur ce. Toute aide est grandement appréciée.


Edit: En gros, comment puis - je automatiser l'appel au javascript qui est lié à cette « Sélectionner tout » case à cocher pour que je puisse saisir la page html contenant tout est il est affiché après avoir cliqué sur la case à cocher.


Edit 2: Voici la sortie de 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

Je reçois actuellement 500 ERREURS du serveur. Ai-je besoin d'inclure tous ces GenericWebUserControls dans la demande de poste ainsi? Aussi je ne dois inclure la EVENTVALIDATION?


EDIT 3: Voici le dernier code. Je reçois encore serveur 500 erreurs.

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: J'ai déterminé que c'est la chaîne postData qui cause l'erreur serveur 500. Si je fais une chaîne vide, il affiche la page web entière. Est -ce que quelqu'un sait si je ne me trompe pas en avoir à mettre tout ce qui venait de Fiddler2 qui avait une valeur dans la chaîne postData? En outre, que __VIEWSTATE est une chaîne très longue. Y at - il des limites ou tout ce que je ne suis pas sûr?


EDIT 5: J'ai couru toutes les chaînes utilisées dans postData par un codeur URL, mais je reçois toujours le serveur 500 erreurs. Est - il possible pour moi de déboguer pourquoi ce corps de poste est invalide?


SOLUTION: Ok, je ne pouvais pas obtenir ma chaîne de postData correcte, mais quand je collais dans le corps brut POST il fonctionne. Cela ressemble à ce sera assez bon, mais mon souci est de savoir si cela va continuer à travailler.

Créé 23/07/2009 à 16:16
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
3

C'est une page asp.net. En cliquant sur la case à cocher à la page provoque affiché sur le serveur. Ainsi, plutôt que d'essayer de simuler le javascript ce que vous voulez faire est la place simulent la demande de poste.

Ceci est notoirement délicat avec des pages ASP.Net, parce que vous devez généralement remplir l'entrée __VIEWSTATE caché. Je recommande d' utiliser un renifleur de paquets comme Fiddler pour voir la demande réelle comme il est envoyé. Vous devriez être en mesure de copier le ViewState à partir de là.

Créé 23/07/2009 à 16:22
source utilisateur

voix
1

Il semble le code JavaScript déclenche un POST à ​​la même page. Firebug montre les éléments suivants dans les données POST.

__EVENTTARGET: ctl00$ContentPlaceHolder1$GenericWebUserControl$ShowAllCheckBox

C'est probablement un bon endroit pour commencer à chercher.

Créé 23/07/2009 à 16:25
source utilisateur

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