Pack d'agilité HTML, Web Scraping et spoofing en C #

c# html-agility-pack spoofing web-scraping

Question

Existe-t-il un moyen de falsifier une requête Web à partir de code C # afin que cela ne ressemble pas à un bot ou à un spam atteignant le site? J'essaie de gratter mon site Web, mais je continue à être bloqué après un certain nombre d'appels. Je veux agir comme un vrai navigateur. J'utilise ce code 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";

Réponse acceptée

Utilisez un navigateur et un violon standard (si les outils de développement ne sont pas à la hauteur) et examinez les en-têtes de requête et de réponse.

Créez vos demandes et demandez aux en-têtes de correspondre à ce que le navigateur envoie (vous pouvez utiliser deux navigateurs différents pour évaluer si cela fait une différence).

En ce qui concerne "se bloquer après un certain nombre d'appels" - étranglez vos appels. N'effectuez qu'un appel toutes les x secondes. Comportez-vous bien sur le site et il se comportera bien avec vous.

Les chances sont bonnes de simplement regarder le nombre d'appels de votre adresse IP par seconde et si elle dépasse un seuil, l'adresse IP est bloquée.


Réponse populaire

Je fais beaucoup trop de web scraping, mais voici les options: j'ai une liste d'en-têtes par défaut que j'ajoute car tous sont attendus d'un navigateur:

        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 est mon client Web).

En guise d’aide supplémentaire, voici ma classe de client Web qui conserve les cookies, ce qui est également une aide considérable:

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;
        }
    }
}

Voici mon utilisation habituelle pour cela. Ajoutez une copie statique à votre classe de site de base avec toutes vos fonctions d’analyse dont vous disposez probablement:

    protected static CookieWebClient wc = new CookieWebClient();

Et appelez-le comme tel:

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;
    }

L’autre raison principale de votre blocage est que la connexion est en cours de fermeture par le serveur car vous avez une connexion ouverte depuis trop longtemps. Vous pouvez le prouver en ajoutant une capture try autour de la partie de téléchargement comme ci-dessus et en cas d'échec, réinitialisez le client Web et essayez de télécharger à nouveau:

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);
                            }

Cela me sauve tout le temps, même si c'était le serveur qui vous rejetait, cela peut tout gâcher. Les cookies sont effacés et votre libre errer à nouveau. Si le pire venait vraiment à se dégrader, ajoutez un support proxy et obtenez un nouveau proxy appliqué par demande de 50.

Cela devrait être plus que suffisant pour que vous lanciez votre propre cul et celui de tout autre site.

EVALUE MOI!



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi