Html Agility Pack, Web Scraping e spoofing in C #

c# html-agility-pack spoofing web-scraping

Domanda

C'è un modo per falsificare una richiesta web dal codice C # in modo che non assomigli a un bot o spam che colpisce il sito? Sto cercando di scansionare il mio sito web, ma continuo a essere bloccato dopo un certo numero di chiamate. Voglio comportarmi come un vero browser. Sto usando questo codice, da 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";

Risposta accettata

Utilizza un normale browser e un violinista (se gli strumenti di sviluppo non sono all'altezza) e dai un'occhiata alle intestazioni di richiesta e risposta.

Costruisci le tue richieste e richiedi le intestazioni in modo che corrispondano a ciò che invia il browser (puoi utilizzare un paio di browser diversi per valutare se questo fa la differenza).

Per quanto riguarda "ottenere bloccato dopo un certo numero di chiamate" - limitare le chiamate. Fai una sola chiamata ogni x secondi. Comportati bene per il sito e si comporterà bene per te.

È probabile che guardino semplicemente al numero di chiamate dal tuo indirizzo IP al secondo e se superi una soglia, l'indirizzo IP viene bloccato.


Risposta popolare

Trovo troppo il web scraping, ma qui ci sono le opzioni: ho un elenco predefinito di intestazioni che aggiungo in quanto tutti questi sono previsti da un browser:

        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 è il mio WebClient).

Come ulteriore aiuto - ecco la mia classe webclient che tiene memorizzati i cookie - che è anche un grande aiuto:

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

Ecco il mio solito uso per questo. Aggiungi una copia statica alla classe del tuo sito base con tutte le funzioni di analisi che probabilmente hai:

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

E chiamalo così:

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

L'altro motivo principale per cui si potrebbe andare in crash è che la connessione viene chiusa dal server in quanto hai avuto una connessione aperta troppo a lungo. Puoi provarlo aggiungendo un try catch alla parte download come sopra e se fallisce, resetta il webclient e prova a scaricare di nuovo:

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

Questo mi salva il culo tutto il tempo, anche se era il server che ti respingeva, questo può ridistribuire il sacco. I cookie sono cancellati e il tuo libero di vagare di nuovo. Se peggio davvero peggiora, aggiungi il supporto proxy e ottieni un nuovo proxy applicato per le richieste di 50 ish.

Questo dovrebbe essere più che sufficiente per farti dare un calcio al tuo culo personale.

VALUTA A ME!




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché