Cómo: obtener datos de un sitio sin realizar un ataque de denegación de servicio / saber cuándo hay datos conocidos en un sitio

Estoy tratando de obtener datos de un sitio usando httpwebrequest\webclient, entonces lo que estoy haciendo es enviar una solicitud para obtener el html del sitio cada 30 segundos.

Lo que sucede es que el sitio me está bloqueando por un ataque de denegación de servicio porque envío demasiadas solicitudes desde la computadora.

¿Cómo puedo saber cuándo hay datos nuevos en un sitio sin obtener datos cada 30 segundos?

OR

¿Cómo puedo obtener datos de un sitio cada 30 segundos sin que me bloqueen por un ataque de denegación de servicio?

ok entonces estoy agregando algo de código:

public void DownloadFile(String remoteFilename, String localFilename)
{
            Stream remoteStream = null;
            Stream localStream = null;
            HttpWebRequest gRequest = (HttpWebRequest)WebRequest.Create(remoteFilename);
            gRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTBDFff GTB7.0";

            gRequest.CookieContainer = new CookieContainer();
            gRequest.Accept = " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, */*";
            gRequest.KeepAlive = true;
            gRequest.ContentType = @"application/x-www-form-urlencoded";


            #region CookieManagement
            if (gCookies != null && gCookies.Count > 0)
            {
                gRequest.CookieContainer.Add(gCookies);
            }

            HttpWebResponse gResponse;

            try{
                gResponse = (HttpWebResponse)gRequest.GetResponse();

                //check if the status code is http 200 or http ok

                if (gResponse.StatusCode == HttpStatusCode.OK)
                {
                    remoteStream = gResponse.GetResponseStream();
                    localStream = File.Create(localFilename);
                    byte[] buffer = new byte[1024];
                    int bytesRead;

                    do
                    {
                        // Read data (up to 1k) from the stream
                        bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                        // Write the data to the local file
                        localStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead > 0);
                }
                else
                {
                    MessageBox.Show("Error!");
                    Application.Exit();
                }

                if (gResponse != null) gResponse.Close();
                if (remoteStream != null) remoteStream.Close();
                if (localStream != null) localStream.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                Application.Exit();
            }
            #endregion
        }

y en el temporizador:

DownloadFile("http://www.fxp.co.il/forumdisplay.php?f=2709", @"C:\tmph.html");

así que este foro es un foro de compra/venta, así que lo que estoy tratando de hacer es obtener el html del foro cada 30 segundos, verifique el html para ver la cantidad de publicaciones de "compra" no leídas usando htmlagilitypack.

preguntado el 02 de mayo de 12 a las 19:05

¿Con qué frecuencia cambian realmente los datos? ¿Qué tan importante es que reciba actualizaciones cada 30 segundos (¿puede obtenerlas cada minuto, dos o cinco?). -

Es un foro por lo que no hay tiempo constante, depende de la gente -

¿Tienen un canal RSS? Muchos foros lo hacen. -

Lo comprobaré, pero incluso si el sitio no fuera un foro, ¿cómo puedes hacerlo? -

Incluso si hubiera una forma de eludir la prevención de DOS, y yo la conociera, no te lo diría, porque impiden que la gente lo haga por una razón. -

1 Respuestas

Puede usar un intervalo de sondeo más largo y hacer solicitudes HEAD para evitar obtener el documento completo. Puede analizar el encabezado devuelto y solo hacer GET si es diferente del encabezado anterior.

contestado el 02 de mayo de 12 a las 22:05

me puedes dar algunos ejemplos por favor - Dan Barzilay

Las solicitudes HEAD son básicamente para ahorrar ancho de banda y le permiten ahorrar algunos bytes al buscar contenido nuevo antes de obtener todo. Si hay un umbral de transferencia que es parte del mecanismo de bloqueo, puede ayudarlo a evitar alcanzarlo. La mayoría de las arañas de los motores de búsqueda que llegan a los foros lo hacen solo dos o tres veces al día y espacian sus solicitudes durante unas pocas horas. - JamieVer

Es difícil dar un buen ejemplo sin saber lo que realmente estás tratando de hacer. Sé que intenta visitar un foro, pero ¿por qué lo hace con tanta frecuencia? ¿Qué es lo que realmente estás tratando de lograr? Además, publique parte de su código existente. La gente tendrá mucha más paciencia si tienes claro lo que quieres y has demostrado algo de tu propio esfuerzo. - JamieVer

ki he editado la publicación con la información que pediste, ¡gracias por ayudar! :) - Dan Barzilay

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.