Estoy tratando de descargar y analizar el HTML de una página web. Recientemente, el sitio web fuente pasó de tener toda su información en una página a ocultar parte de ella detrás de JavaScript. Hay una casilla de verificación Mostrar todo que debe activarse para ver toda la página.
Aquí está el sitio web: sitio web de origen
Básicamente, estoy buscando automatizar la recuperación de esa página después de haber hecho clic en la casilla de verificación. Actualmente, tenemos un programa en C que descarga la página web y maneja nuestro análisis sintáctico. No estoy seguro de si puede aceptar javascript en la URL si eso se puede usar para resolver este problema (he intentado usar un bookmarklet para llamar al javascript desde la URL, pero no pude obtenerlo para manejar el casilla de verificación), pero puede manejar archivos si es más fácil escribir un programa C # que pueda manejar esto.
Preferiría una forma de codificar esto por mí mismo en lugar de utilizar un programa de terceros para evitar tener que instalar nada en el servidor en el que se ejecuta. Cualquier ayuda es muy apreciada.
Editar: Básicamente, ¿cómo puedo automatizar la llamada a la javascript que está vinculada a esa casilla Seleccionar todo para que pueda tomar la página html que contiene todo lo que se muestra después de hacer clic en la casilla de verificación.
Edición 2: Aquí está la salida 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
Actualmente recibo 500 ERRORES del servidor. ¿Debo incluir todos esos GenericWebUserControls en la solicitud posterior también? ¿También necesito incluir EVENTVALIDATION?
EDIT 3: Aquí está el último código. Todavía estoy recibiendo errores del servidor 500.
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: He determinado que es la cadena postData la que está causando el error del servidor 500. Si lo hago una cadena vacía, muestra toda la página web. ¿Alguien sabe si estoy en lo correcto al tener que poner todo lo que vino de Fiddler2 que tenía un valor en la cadena de postData? Además, ese __VIEWSTATE es una cadena increíblemente larga. ¿Hay límites o algo de lo que no estoy seguro?
EDIT 5: ejecuté todas las cadenas utilizadas en postData a través de un codificador de URL, pero sigo recibiendo errores del servidor 500. ¿Hay alguna manera de depurar por qué el cuerpo de la publicación no es válido?
SOLUCIÓN: Ok, no pude corregir mi cadena de datos posteriores, pero cuando pegué en el cuerpo de POST sin procesar, funciona. Parece que será lo suficientemente bueno, pero mi preocupación es si esto continuará funcionando.













