Html Agility Pack, Web Scraping y spoofing en C #

c# html-agility-pack spoofing web-scraping

Pregunta

¿Hay alguna forma de falsificar una solicitud web del código C # para que no parezca un bot o spam que llegue al sitio? Estoy tratando de eliminar mi sitio web, pero me siguen bloqueando después de una cierta cantidad de llamadas. Quiero actuar como un navegador real. Estoy usando este código, de HTML Agility Pack.

 var web = new HtmlWeb();
                web.UserAgent =
                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11";

Respuesta aceptada

Use un navegador y un violinista regulares (si las herramientas de desarrollo no están en lo correcto) y observe los encabezados de solicitud y respuesta.

Acumule sus solicitudes y solicite los encabezados para que coincidan con lo que el navegador envía (puede usar un par de navegadores diferentes para evaluar si esto marca una diferencia).

En lo que respecta al "bloqueo después de una cierta cantidad de llamadas", acelere sus llamadas. Solo haz una llamada cada x segundos. Compórtate bien con el sitio y se comportará bien contigo.

Existe la posibilidad de que simplemente miren el número de llamadas desde su dirección IP por segundo y si pasa un umbral, la dirección IP se bloquea.


Respuesta popular

Hago demasiado web scraping, pero aquí están las opciones: Tengo una lista predeterminada de encabezados que agrego, ya que todo esto se espera de un navegador:

        wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11";
        wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        wc.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wc.Headers[HttpRequestHeader.AcceptEncoding] = "gzip,deflate,sdch";
        wc.Headers[HttpRequestHeader.AcceptLanguage] = "en-GB,en-US;q=0.8,en;q=0.6";
        wc.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.3";

(WC es mi cliente web).

Como ayuda adicional, aquí está mi clase de cliente web que mantiene las cookies almacenadas, que también es una ayuda masiva:

public class CookieWebClient : WebClient
{

    public CookieContainer m_container = new CookieContainer();
    public WebProxy proxy = null;

    protected override WebRequest GetWebRequest(Uri address)
    {
        try
        {
            ServicePointManager.DefaultConnectionLimit = 1000000;
            WebRequest request = base.GetWebRequest(address);
            request.Proxy = proxy;

            HttpWebRequest webRequest = request as HttpWebRequest;
            webRequest.Pipelined = true;
            webRequest.KeepAlive = true;
            if (webRequest != null)
            {
                webRequest.CookieContainer = m_container;
            }

            return request;
        }
        catch
        {
            return null;
        }
    }
}

Aquí está mi uso habitual para ello. Agregue una copia estática a su clase de sitio base con todas las funciones de análisis que probablemente tenga:

    protected static CookieWebClient wc = new CookieWebClient();

Y llámalo como tal:

public HtmlDocument Download(string url)
    {
        HtmlDocument hdoc = new HtmlDocument();
        HtmlNode.ElementsFlags.Remove("option");
        HtmlNode.ElementsFlags.Remove("select");
        Stream read = null;
        try
        {
            read = wc.OpenRead(url);
        }
        catch (ArgumentException)
        {
            read = wc.OpenRead(HttpHelper.HTTPEncode(url));
        }

        hdoc.Load(read, true);


        return hdoc;
    }

La otra razón principal por la que puede fallar es que el servidor está cerrando la conexión, ya que ha tenido una conexión abierta durante demasiado tiempo. Puede probar esto agregando un retén de prueba alrededor de la parte de descarga como se indica arriba y si falla, reinicie el cliente web e intente descargar de nuevo:

HtmlDocument d = new HtmlDocument();
                            try
                            {
                                d = this.Download(prp.PropertyUrl);
                            }
                            catch (WebException e)
                            {
                                this.Msg(Site.ErrorSeverity.Severe, "Error connecting to " + this.URL + " : Resubmitting..");
                                wc = new CookieWebClient();
                                d = this.Download(prp.PropertyUrl);
                            }

Esto me salva el culo todo el tiempo, incluso si el servidor te rechazara, esto puede volver a jig el lote. Las cookies se borran y su libre para vagar de nuevo. Si es peor, la situación empeora: agregue soporte de proxy y obtenga un nuevo proxy aplicado por cada 50 solicitudes.

Eso debería ser más que suficiente para que puedas patear el tuyo y el de cualquier otro sitio.

¡Califícame!




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué