Extraer contenido de pagina web a Formulario C#

Iniciado por _vicho_, 30 Octubre 2019, 15:44 PM

0 Miembros y 1 Visitante están viendo este tema.

_vicho_

Hola en mi formulario estoy extrayendo el valor del dolar desde una pagina web, e probado con 2 paginas diferentes y si lo logre, pero en la que se me pidió sacar el valor no se deja ya que usa un Script para actualizar a cada minuto y no se encuentra directamente en la pagina les comparto mi código:


public void Satdolar()
       {
           WebRequest request = WebRequest.Create("https://www.eldolar.info/en/mexico/dia/hoy");
           // If required by the server, set the credentials.  
           request.Credentials = CredentialCache.DefaultCredentials;

           // Get the response.  
           WebResponse response = request.GetResponse();
           // Display the status.  
           Console.WriteLine(((HttpWebResponse)response).StatusDescription);

           // Get the stream containing content returned by the server.
           // The using block ensures the stream is automatically closed.
           using (Stream dataStream = response.GetResponseStream())
           {
               // Open the stream using a StreamReader for easy access.  
               StreamReader reader = new StreamReader(dataStream);
               // Read the content.  
               string responseFromServer = reader.ReadToEnd();
               // Display the content.  
               string compra,  Stncompra;
               compra = responseFromServer.Substring(responseFromServer.IndexOf("pagos</span></a></td><td><div></div></td><td><div></div></td><td colspan=2 class=xTimes>") + 88);
               Stncompra = compra.Substring(0, 6);
               radioButton2.Text = Stncompra;

           }

           // Close the response.  
           response.Close();
       }
       public void XEdolar()
       {
           WebRequest request = WebRequest.Create("https://www.xe.com/es/");
           // If required by the server, set the credentials.  
           request.Credentials = CredentialCache.DefaultCredentials;

           // Get the response.  
           WebResponse response = request.GetResponse();
           // Display the status.  
           Console.WriteLine(((HttpWebResponse)response).StatusDescription);

           // Get the stream containing content returned by the server.
           // The using block ensures the stream is automatically closed.
           using (Stream dataStream = response.GetResponseStream())
           {
               // Open the stream using a StreamReader for easy access.  
               StreamReader reader = new StreamReader(dataStream);
               // Read the content.  
               string responseFromServer = reader.ReadToEnd();
               // Display the content.  
               string compra, Stncompra;
               compra = responseFromServer.Substring(responseFromServer.IndexOf("from=\"MXN\" to=\"USD\">") + 20);
               Stncompra = compra;//.Substring(0, 5000);
               txtDollar.Text = Stncompra;

           }

           // Close the response.  
           response.Close();
       }


el Satdolar si me extrae el fragmento que ocupo de la pagina web el XEdolar me devuelve la pagina web desde el inicio porque no encuentra el index que le establecí.


Existe una manera de extraer el valor después de a verse ejecutado el script?

la pagina que ocupo el valor del dolar es esta https://www.xe.com/es/


gracias por sus respuestas buen día.




P.D. viendo el codigo en chrome con F12 (de ahi saque el index que tengo) me manda este mensaje:

{"warning":"<!-- WARNING: Automated extraction of rates is prohibited under the Terms of Use. -->\n","payload":{"isTradeable":false},"resourceStrings":{"com.xe.components.pages.home.trc.startsaving":"Empiece a ahorrar en sus transferencias","com.xe.components.pages.home.trc.quickeasysecure":"Transferencias internacionales de dinero r\u00e1pidas, f\u00e1ciles y seguras","com.xe.components.pages.home.trc.ctabutton":"M\u00e1s informaci\u00f3n acerca de XE Money Transfer","com.xe.components.pages.home.trc.title":"Conversor de divisas XE","com.xe.components.pages.home.trc.subtitle":"Tasas de transferencia","com.xe.components.pages.home.tab.midmarket.title":"Tipos de mercado en tiempo real","com.xe.components.pages.home.tab.midmarket.body":"Vea tipos de cambio precisos y fiables de <a href=\"/faq/rates_buyorsellrates.php\">mid-market</a> en tiempo real de los mercados mundiales de divisas, generados a partir de m\u00e1s de 100\u00a0fuentes internacionales.","com.xe.components.pages.home.tab.tradeable.title":"Tasas de transferencia en tiempo real","com.xe.components.pages.home.tab.tradeable.body":"Get a quote for an international money transfer from <a href=\"/xemoneytransfer/uk\">XE Money Transfer</a>"}}


ThunderCls

Segun veo la web tiene una proteccion anti-scraping, esto es dado que tienen API de pago y por consiguiente es de esperar que no te vayan a dejar simplemente tomar el contenido asi tan facil. El metodo que utilizan es que la web hace una peticion a su API en https://www.xe.com/es/api/rates_table.php y el server responde con un payload "rates" cifrado, me imagino que sea una especie de json con los datos de todas las conversiones que luego algun codigo js en la pc cliente se encargara de descifrar y de esta forma actualiza la web. Lo ideal en este caso seria poder interceptar la funcion decifradora e implementarla en tu propia aplicacion para luego hacer simples peticiones a su API sin necesidad de hacer parse o scraping a la web, pero esto necesita ciertas habilidades que, desde el respeto, no creo que poseas, por consiguiente, te aconsejaria ir por una ruta mucho mas sencilla y es usando Selenium y/o algun motor de navegador web+js como:

SimpleBrowser(https://github.com/SimpleBrowserDotNet/SimpleBrowser)
CefSharp(https://github.com/cefsharp/CefSharp)
Optimus (https://github.com/RusKnyaz/Optimus)
Puppeteer Sharp(https://github.com/kblok/puppeteer-sharp)
PhantomJS (descontinuado).
Aqui tienes una lista entera (https://github.com/dhamaniasad/HeadlessBrowsers)

Aqui puedes tener una idea de como implementar Selenium con PhantomJS para hacer scraping
https://stackoverflow.com/questions/24288726/scraping-webpage-generated-by-javascript-with-c-sharp/24289395#24289395

Suerte
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

_vicho_

y efectivamente ThunderCls, si me tope un Json mientras iba leyendo cada parte de la web con el devtools de google.

Gracias por explicarme como esta integrada esa web y los temas que ocupo para resolver mi problema.

;-)