Nota: poiché la versione completa di questa risposta supera il limite di lunghezza di Stack Overflow, dovrai andare su GitHub per leggere la versione estesa, con ulteriori suggerimenti e dettagli.
Al fine di ostacolare la raschiatura (nota anche come Webscraping , Screenscraping , data mining Web , Web raccolta o estrazione di dati Web ), è utile conoscere come funzionano questi raschietti, e, per estensione, ciò che impedisce loro di lavorare bene.
Esistono vari tipi di raschietto e ognuno funziona in modo diverso:
Ragni, come ad esempio i bot di Google o le fotocopiatrici di siti Web come HTtrack , che seguono ricorsivamente i collegamenti ad altre pagine per ottenere dati. Questi vengono talvolta utilizzati per lo scraping mirato per ottenere dati specifici, spesso in combinazione con un parser HTML per estrarre i dati desiderati da ciascuna pagina.
Script della shell: a volte, vengono utilizzati strumenti Unix comuni per lo scraping: Wget o Curl per scaricare pagine e Grep (Regex) per estrarre i dati.
Parser HTML, come quelli basati su Jsoup, Scrapy e altri. Simile a quelli basati su regex shell-script, funzionano estraendo i dati dalle pagine in base a schemi in HTML, di solito ignorando tutto il resto.
Ad esempio: se il tuo sito Web ha una funzione di ricerca, un tale raschietto potrebbe inviare una richiesta per una ricerca e quindi ottenere tutti i link dei risultati e i relativi titoli dalla pagina dei risultati HTML, al fine di ottenere specificamente solo i link dei risultati di ricerca e i loro titoli . Questi sono i più comuni.
Screensaver, basato su es. Selenium o PhantomJS , che aprono il tuo sito Web in un vero browser, eseguono JavaScript, AJAX e così via, quindi ottengono il testo desiderato dalla pagina Web, in genere:
Ottenere l'HTML dal browser dopo che la pagina è stata caricata e JavaScript è stato eseguito, quindi utilizzare un parser HTML per estrarre i dati desiderati. Questi sono i più comuni e anche molti dei metodi per rompere i parser / raschiatori HTML funzionano anche qui.
Fare uno screenshot delle pagine renderizzate e quindi usare OCR per estrarre il testo desiderato dallo screenshot. Questi sono rari e solo i raschiatori dedicati che vogliono davvero i tuoi dati lo configureranno.
Servizi di webscraping come ScrapingHub o Kimono . In effetti, ci sono persone il cui compito è capire come demolire il tuo sito ed estrarre il contenuto che altri possono usare.
Non sorprende che i servizi di scraping professionale siano i più difficili da scoraggiare, ma se rendi difficile e dispendioso il tempo capire come raschiare il tuo sito, questi (e le persone che li pagano per farlo) potrebbero non essere disturbati a raschiare il tuo sito web.
Incorporare il tuo sito Web nelle pagine di altri siti con frame e incorporare il tuo sito in app mobili.
Pur non essendo tecnicamente scraping, le app mobili (Android e iOS) possono incorporare siti Web e iniettare CSS e JavaScript personalizzati, cambiando così completamente l'aspetto delle tue pagine.
Human copy - paste: le persone copieranno e incolleranno i tuoi contenuti per usarli altrove.
Esistono molte sovrapposizioni tra questi diversi tipi di raschietto e molti raschiatori si comporteranno in modo simile, anche se utilizzano tecnologie e metodi diversi.
Questi suggerimenti sono principalmente le mie idee, varie difficoltà che ho incontrato durante la scrittura di raschietti, nonché frammenti di informazioni e idee provenienti da interwebs.
Come smettere di raschiare
Non puoi impedirlo completamente , dal momento che qualunque cosa tu faccia, determinati raschiatori possono ancora capire come raschiare. Tuttavia, puoi fermare molti raschietti facendo alcune cose:
Monitora i tuoi registri e schemi di traffico; limitare l'accesso se vedi attività insolita:
Controlla i tuoi registri regolarmente e, in caso di attività insolita indicativa di accesso automatizzato (raschiatori), come molte azioni simili dallo stesso indirizzo IP, puoi bloccare o limitare l'accesso.
In particolare, alcune idee:
Limitazione della velocità:
Consentire solo agli utenti (e ai raschiatori) di eseguire un numero limitato di azioni in un determinato momento, ad esempio consentire solo poche ricerche al secondo da qualsiasi indirizzo IP o utente specifico. Ciò rallenterà i raschiatori e li renderà inefficaci. Puoi anche mostrare un captcha se le azioni vengono completate troppo velocemente o più velocemente di quanto farebbe un utente reale.
Rileva attività insolite:
Se vedi attività insolite, come molte richieste simili da un indirizzo IP specifico, qualcuno che guarda un numero eccessivo di pagine o esegue un numero insolito di ricerche, puoi impedire l'accesso o mostrare un captcha per le richieste successive.
Non limitarti a monitorare e limitare i limiti in base all'indirizzo IP: utilizza anche altri indicatori:
Se blocchi o limiti la velocità, non limitarti a farlo in base all'indirizzo IP; è possibile utilizzare altri indicatori e metodi per identificare utenti o raschiatori specifici. Alcuni indicatori che possono aiutarti a identificare utenti / raschiatori specifici includono:
La velocità con cui gli utenti compilano i moduli e su quale pulsante fanno clic;
Puoi raccogliere molte informazioni con JavaScript, come dimensioni / risoluzione dello schermo, fuso orario, caratteri installati, ecc .; puoi usarlo per identificare gli utenti.
Intestazioni HTTP e loro ordine, in particolare User-Agent.
Ad esempio, se ricevi molte richieste da un singolo indirizzo IP, tutte utilizzano lo stesso User Agent, le dimensioni dello schermo (determinate con JavaScript) e l'utente (in questo caso lo scraper) fa sempre clic sul pulsante allo stesso modo e in intervalli regolari, è probabilmente un raschietto per schermo; e puoi bloccare temporaneamente richieste simili (es. bloccare tutte le richieste con quell'agente utente e le dimensioni dello schermo provenienti da quel particolare indirizzo IP), e in questo modo non disturberai gli utenti reali su quell'indirizzo IP, ad es. in caso di una connessione Internet condivisa.
Puoi anche andare oltre, poiché puoi identificare richieste simili, anche se provengono da indirizzi IP diversi, indicativi di scraping distribuito (uno scraper che utilizza una botnet o una rete di proxy). Se ricevi molte richieste altrimenti identiche, ma provengono da indirizzi IP diversi, puoi bloccare. Ancora una volta, fai attenzione a non bloccare inavvertitamente gli utenti reali.
Questo può essere efficace contro i salvaschermo che eseguono JavaScript, in quanto puoi ottenere molte informazioni da loro.
Domande correlate su Security Stack Exchange:
Invece di bloccare temporaneamente l'accesso, utilizzare un captcha:
Il modo semplice di implementare la limitazione della velocità sarebbe quello di bloccare temporaneamente l'accesso per un certo periodo di tempo, tuttavia l'utilizzo di un captcha potrebbe essere migliore, vedere la sezione sui captcha più in basso.
Richiedi registrazione e login
Richiedi la creazione di un account per visualizzare i tuoi contenuti, se ciò è possibile per il tuo sito. Questo è un buon deterrente per i raschiatori, ma è anche un buon deterrente per gli utenti reali.
- Se è richiesta la creazione e l'accesso dell'account, è possibile tenere traccia con precisione delle azioni dell'utente e del raschietto. In questo modo, puoi facilmente rilevare quando un account specifico viene utilizzato per lo scraping e vietarlo. Cose come la limitazione della frequenza o il rilevamento di abusi (come un numero enorme di ricerche in breve tempo) diventano più facili, in quanto è possibile identificare i raschiatori specifici anziché solo gli indirizzi IP.
Per evitare che gli script creino molti account, è necessario:
Richiedi un indirizzo e-mail per la registrazione e verifica l'indirizzo e-mail inviando un collegamento che deve essere aperto per attivare l'account. Consenti solo un account per indirizzo email.
Richiede la risoluzione di un captcha durante la creazione della registrazione / dell'account.
Richiedere la creazione di un account per visualizzare i contenuti allontanerà utenti e motori di ricerca; se hai bisogno di creare un account per visualizzare un articolo, gli utenti andranno altrove.
Blocca l'accesso dagli indirizzi IP del servizio di cloud hosting e scraping
A volte, gli scraper verranno eseguiti da servizi di web hosting, come Amazon Web Services o GAE o VPS. Limitare l'accesso al tuo sito Web (o mostrare un captcha) per richieste provenienti dagli indirizzi IP utilizzati da tali servizi di cloud hosting.
Allo stesso modo, è anche possibile limitare l'accesso dagli indirizzi IP utilizzati dai provider proxy o VPN, poiché gli scraper possono utilizzare tali server proxy per evitare il rilevamento di molte richieste.
Ricorda che bloccando l'accesso da server proxy e VPN, influenzerai negativamente gli utenti reali.
Rendi il tuo messaggio di errore anonimo se blocchi
Se si blocca / limita l'accesso, è necessario assicurarsi di non dire al raschietto che cosa ha causato il blocco, fornendo in tal modo indizi su come riparare il raschietto. Quindi una cattiva idea sarebbe quella di mostrare pagine di errore con testo come:
Troppe richieste dal tuo indirizzo IP, riprova più tardi.
Errore, intestazione User Agent non presente!
Invece, mostra un messaggio di errore amichevole che non dice al raschietto cosa lo ha causato. Qualcosa del genere è molto meglio:
- Scusa, qualcosa è andato storto. È possibile contattare l'assistenza tramite
helpdesk@example.com
, se il problema persiste.
Questo è anche molto più intuitivo per gli utenti reali, qualora dovessero mai vedere una pagina di errore del genere. Dovresti anche considerare di mostrare un captcha per le richieste successive invece di un blocco rigido, nel caso in cui un utente reale veda il messaggio di errore, in modo da non bloccare e quindi farti contattare da utenti legittimi.
Usa i captcha se sospetti che al tuo sito Web acceda da un raschietto.
I captcha ("Test completamente automatizzato per distinguere computer e esseri umani") sono molto efficaci contro l'arresto dei raschiatori. Sfortunatamente, sono anche molto efficaci per gli utenti irritanti.
Pertanto, sono utili quando si sospetta un possibile raschietto e si desidera interrompere il raschiamento, senza bloccare anche l'accesso nel caso in cui non sia un raschietto ma un vero utente. Potresti prendere in considerazione l'idea di mostrare un captcha prima di consentire l'accesso al contenuto se sospetti un raschietto.
Aspetti da tenere presente quando si utilizzano i captcha:
Non fare il tuo, usa qualcosa come reCaptcha di Google : è molto più facile che implementare un captcha da solo, è più facile da usare di una soluzione di testo sfocata e deformata che potresti trovare con te (gli utenti spesso devono solo spuntare una casella ), ed è anche molto più difficile da risolvere per uno scripter rispetto a una semplice immagine pubblicata dal tuo sito
Non includere la soluzione per il captcha nel markup HTML: in realtà ho visto un sito Web che aveva la soluzione per il captcha nella pagina stessa (anche se abbastanza ben nascosta), rendendolo quindi piuttosto inutile. Non fare qualcosa del genere. Ancora una volta, usa un servizio come reCaptcha e non avrai questo tipo di problema (se lo usi correttamente).
I captcha possono essere risolti alla rinfusa: ci sono servizi di risoluzione dei captcha in cui gli esseri umani reali, a basso costo, risolvono i captcha alla rinfusa. Ancora una volta, utilizzare reCaptcha è una buona idea qui, in quanto hanno protezioni (come il tempo relativamente breve che l'utente ha per risolvere il captcha). È improbabile che questo tipo di servizio venga utilizzato a meno che i tuoi dati non siano davvero preziosi.
Servi il contenuto del testo come immagine
È possibile eseguire il rendering del testo in un lato server dell'immagine e servirlo da visualizzare, il che ostacolerà i semplici raschiatori che estraggono il testo.
Tuttavia, questo è negativo per gli screen reader, i motori di ricerca, le prestazioni e praticamente tutto il resto. È anche illegale in alcuni luoghi (a causa dell'accessibilità, ad es. L'American with Disabilities Act), ed è anche facile aggirare un po 'di OCR, quindi non farlo.
Puoi fare qualcosa di simile con gli sprite CSS, ma soffre degli stessi problemi.
Non esporre il set di dati completo:
Se possibile, non fornire un modo per uno script / bot di ottenere tutti i tuoi set di dati. Ad esempio: hai un sito di notizie, con molti singoli articoli. È possibile rendere tali articoli accessibili solo cercandoli tramite la ricerca sul sito e, se non si dispone di un elenco di tutti gli articoli sul sito e dei loro URL ovunque, tali articoli saranno accessibili solo utilizzando la ricerca caratteristica. Ciò significa che uno script che desidera ottenere tutti gli articoli dal tuo sito dovrà fare ricerche per tutte le possibili frasi che possono apparire nei tuoi articoli al fine di trovarli tutti, il che richiederà tempo, orribilmente inefficiente e, si spera, renderà il raschietto si arrende.
Questo sarà inefficace se:
- Il bot / script non desidera / necessita comunque dell'intero set di dati.
- I tuoi articoli vengono pubblicati da un URL simile a qualcosa
example.com/article.php?articleId=12345
. Questo (e cose simili) che permetteranno ai raschiatori di iterare semplicemente su tutto il filearticleId
tutti gli articoli e di richiedere tutti gli articoli in quel modo.
- Esistono altri modi per trovare infine tutti gli articoli, ad esempio scrivendo uno script per seguire i collegamenti all'interno degli articoli che portano ad altri articoli.
- Cercare qualcosa come "e" o "il" può rivelare quasi tutto, quindi è qualcosa di cui essere consapevoli. (Puoi evitarlo solo restituendo i primi 10 o 20 risultati).
- Hai bisogno di motori di ricerca per trovare i tuoi contenuti.
Non esporre API, endpoint e cose simili:
Assicurati di non esporre alcuna API, anche involontariamente. Ad esempio, se si utilizzano AJAX o le richieste di rete dall'interno di Adobe Flash o Java Applet (Dio non voglia!) Per caricare i propri dati, è banale guardare le richieste di rete dalla pagina e capire dove stanno andando quelle richieste, e quindi decodificare e utilizzare tali endpoint in un programma di raschietto. Assicurati di offuscare i tuoi endpoint e renderli difficili da usare per gli altri, come descritto.
Per scoraggiare parser e scraper HTML:
Poiché i parser HTML funzionano estraendo il contenuto dalle pagine in base a schemi identificabili nell'HTML, possiamo modificare intenzionalmente tali schemi per rompere questi raschiatori o persino rovinarli. La maggior parte di questi suggerimenti si applica anche ad altri raschiatori come ragni e salvaschermi.
Cambia frequentemente il tuo HTML
I raschiatori che elaborano l'HTML lo fanno direttamente estraendo i contenuti da parti specifiche e identificabili della tua pagina HTML. Ad esempio: se tutte le pagine del tuo sito Web hanno una div
con un id di article-content
, che contiene il testo dell'articolo, è banale scrivere uno script per visitare tutte le pagine dell'articolo sul tuo sito ed estrarre il testo del contenuto del article-content
div su ogni pagina di articolo e voilà, il raschietto ha tutti gli articoli del tuo sito in un formato che può essere riutilizzato altrove.
Se modifichi frequentemente l'HTML e la struttura delle tue pagine, tali scraper non funzioneranno più.
Puoi cambiare frequentemente l'id e le classi di elementi nel tuo HTML, forse anche automaticamente. Quindi, se il tuo div.article-content
diventa qualcosa di simile div.a4c36dda13eaf0
e cambia ogni settimana, il raschietto funzionerà bene inizialmente, ma si romperà dopo una settimana. Assicurati di cambiare anche la lunghezza dei tuoi ID / classi, altrimenti lo scraper userà div.[any-14-characters]
per trovare il div desiderato. Attenzione anche ad altri fori simili ..
Se non è possibile trovare il contenuto desiderato dal markup, lo scraper lo farà dal modo in cui è strutturato l'HTML. Quindi, se tutte le pagine degli articoli sono simili in quanto ogni div
all'interno di una div
che viene dopo a h1
è il contenuto dell'articolo, gli scraper otterranno il contenuto dell'articolo in base a quello. Ancora una volta, per ovviare a questo, puoi aggiungere / rimuovere markup extra al tuo HTML, periodicamente e in modo casuale, ad es. aggiungendo extra div
o più span
. Con la moderna elaborazione HTML lato server, questo non dovrebbe essere troppo difficile.
Cose da tenere presente:
Sarà noioso e difficile da implementare, mantenere e eseguire il debug.
Impedirai la memorizzazione nella cache. Soprattutto se cambi ID o classi dei tuoi elementi HTML, ciò richiederà modifiche corrispondenti nei tuoi file CSS e JavaScript, il che significa che ogni volta che li modifichi, dovranno essere riscaricati dal browser. Ciò comporterà tempi di caricamento della pagina più lunghi per visitatori abituali e un maggiore carico del server. Se lo cambi solo una volta alla settimana, non sarà un grosso problema.
I raschiatori intelligenti saranno ancora in grado di ottenere i tuoi contenuti deducendo dove si trova il contenuto reale, ad es. sapendo che un grande blocco di testo sulla pagina è probabilmente l'articolo reale. Ciò consente di trovare ed estrarre ancora i dati desiderati dalla pagina. Boilerpipe fa esattamente questo.
In sostanza, assicurati che non sia facile per uno script trovare il contenuto effettivo desiderato per ogni pagina simile.
Vedi anche Come impedire ai crawler che dipendono da XPath di ottenere il contenuto della pagina per i dettagli su come questo può essere implementato in PHP.
Cambia il tuo HTML in base alla posizione dell'utente
Questo è un po 'simile al suggerimento precedente. Se offri HTML diverso in base alla posizione / al paese dell'utente (determinato dall'indirizzo IP), questo potrebbe interrompere gli scraper che vengono consegnati agli utenti. Ad esempio, se qualcuno sta scrivendo un'app mobile che raschia i dati dal tuo sito, inizialmente funzionerà correttamente, ma si interromperà quando verrà effettivamente distribuito agli utenti, poiché tali utenti potrebbero trovarsi in un Paese diverso e quindi ottenere HTML diverso, che il raschietto incorporato non è stato progettato per il consumo.
Cambia frequentemente il tuo HTML, attivamente avvitandolo con i raschiatori facendo così!
Un esempio: hai una funzione di ricerca sul tuo sito Web, situata in example.com/search?query=somesearchquery
, che restituisce il seguente codice HTML:
<div class="search-result">
<h3 class="search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
<p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
<a class"search-result-link" href="/stories/story-link">Read more</a>
</div>
(And so on, lots more identically structured divs with search results)
Come avrai intuito, è facile da raschiare: tutto ciò che un raschietto deve fare è premere l'URL di ricerca con una query ed estrarre i dati desiderati dall'HTML restituito. Oltre a modificare periodicamente l'HTML come descritto sopra, puoi anche lasciare il vecchio markup con i vecchi ID e classi, nasconderlo con CSS e riempirlo con dati falsi, avvelenando così il raschietto. Ecco come è possibile modificare la pagina dei risultati di ricerca:
<div class="the-real-search-result">
<h3 class="the-real-search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
<p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
<a class"the-real-search-result-link" href="/stories/story-link">Read more</a>
</div>
<div class="search-result" style="display:none">
<h3 class="search-result-title">Visit Example.com now, for all the latest Stack Overflow related news !</h3>
<p class="search-result-excerpt">Example.com is so awesome, visit now !</p>
<a class"search-result-link" href="http://example.com/">Visit Now !</a>
</div>
(More real search results follow)
Ciò significa che i raschiatori scritti per estrarre dati dall'HTML in base a classi o ID continueranno a funzionare apparentemente, ma otterranno dati falsi o persino annunci, dati che gli utenti reali non vedranno mai, poiché sono nascosti con CSS.
Avvita con il raschietto: inserisci dati honeypot falsi e invisibili nella tua pagina
Aggiungendo l'esempio precedente, è possibile aggiungere elementi honeypot invisibili al codice HTML per catturare i raschiatori. Un esempio che potrebbe essere aggiunto alla pagina dei risultati di ricerca precedentemente descritta:
<div class="search-result" style="display:none">
<h3 class="search-result-title">This search result is here to prevent scraping</h3>
<p class="search-result-excerpt">If you're a human and see this, please ignore it. If you're a scraper, please click the link below :-)
Note that clicking the link below will block access to this site for 24 hours.</p>
<a class"search-result-link" href="/scrapertrap/scrapertrap.php">I'm a scraper !</a>
</div>
(The actual, real, search results follow.)
Uno scraper scritto per ottenere tutti i risultati della ricerca lo raccoglierà, proprio come uno qualsiasi degli altri, risultati di ricerca reali sulla pagina e visiterà il collegamento, cercando il contenuto desiderato. Un vero essere umano non lo vedrà nemmeno prima (a causa del fatto che è nascosto con CSS) e non visiterà il link. Un ragno genuino e desiderabile come quello di Google non visiterà il link neanche perché non hai autorizzato il /scrapertrap/
tuo robots.txt.
Puoi scrapertrap.php
fare qualcosa come bloccare l'accesso per l'indirizzo IP che lo ha visitato o forzare un captcha per tutte le richieste successive da quell'IP.
Non dimenticare di non consentire il tuo honeypot ( /scrapertrap/
) nel tuo file robots.txt in modo che i robot dei motori di ricerca non rientrino in esso.
Puoi / dovresti combinarlo con il consiglio precedente di cambiare frequentemente il tuo HTML.
Cambia anche questo frequentemente, poiché i raschiatori alla fine impareranno a evitarlo. Modifica l'URL e il testo del honeypot. Vuoi anche considerare di cambiare il CSS inline usato per nasconderti e usare invece un attributo ID e un CSS esterno, poiché i raschiatori impareranno a evitare qualsiasi cosa che abbia un style
attributo con CSS usato per nascondere il contenuto. Prova anche a abilitarlo solo a volte, quindi il raschietto funziona inizialmente, ma si rompe dopo un po '. Questo vale anche per il suggerimento precedente.
Le persone maligne possono impedire l'accesso agli utenti reali condividendo un link al tuo honeypot o persino incorporando quel link da qualche parte come immagine (ad es. Su un forum). Cambia frequentemente l'URL e abbrevia i tempi di ban.
Fornisci dati falsi e inutili se rilevi un raschietto
Se rilevi ciò che è ovviamente un raschietto, puoi fornire dati falsi e inutili; questo corromperà i dati che il raschietto ottiene dal tuo sito web. Dovresti anche rendere impossibile distinguere tali dati falsi da dati reali, in modo che gli scraper non sappiano di essere fregati.
Ad esempio: hai un sito Web di notizie; se rilevi un raschietto, invece di bloccare l'accesso, pubblica articoli falsi generati casualmente e questo avvelenerà i dati che il raschietto ottiene. Se rendi indistinguibili i tuoi dati falsi dalla cosa reale, renderai difficile agli scraper ottenere ciò che vogliono, vale a dire i dati reali e reali.
Non accettare richieste se l'agente utente è vuoto / mancante
Spesso i raschiatori scritti pigramente non inviano un'intestazione User Agent con la loro richiesta, mentre tutti i browser e gli spider dei motori di ricerca lo faranno.
Se ricevi una richiesta in cui l'intestazione User Agent non è presente, puoi mostrare un captcha o semplicemente bloccare o limitare l'accesso. (O servire dati falsi come sopra descritto, o qualcos'altro ..)
È banale falsificare, ma vale la pena implementare come misura contro raschiatori scritti male.
Non accettare richieste se l'agente utente è un raschietto comune; quelli nella lista nera usati dai raschiatori
In alcuni casi, gli scraper utilizzeranno un User Agent che nessun browser di browser o motore di ricerca utilizza, come:
- "Mozilla" (Solo quello, nient'altro. Ho visto alcune domande sullo scraping qui, usando quello. Un vero browser non userà mai solo quello)
- "Java 1.7.43_u43" (Per impostazione predefinita, HttpUrlConnection di Java utilizza qualcosa del genere.)
- "BIZCO EasyScraping Studio 2.0"
- "wget", "curl", "libcurl", .. (Wget e cURL vengono talvolta utilizzati per lo scraping di base)
Se ritieni che una stringa dell'agente utente specifico sia utilizzata dagli scraper sul tuo sito e non sia utilizzata da browser reali o ragni legittimi, puoi anche aggiungerla alla tua lista nera.
Se non richiede risorse (CSS, immagini), non è un vero browser.
Un vero browser richiederà (quasi sempre) e scaricherà risorse come immagini e CSS. I parser e i raschiatori HTML non lo faranno perché sono interessati solo alle pagine effettive e al loro contenuto.
Puoi registrare le richieste nelle tue risorse e se vedi molte richieste solo per l'HTML, potrebbe essere un raschietto.
Attenzione che robot dei motori di ricerca, antichi dispositivi mobili, screen reader e dispositivi configurati in modo errato potrebbero non richiedere neanche asset.
Utilizzare e richiedere cookie; usali per tenere traccia delle azioni dell'utente e del raschietto.
È possibile richiedere l'attivazione dei cookie per visualizzare il tuo sito Web. Ciò scoraggerà gli scrittori di raschietti inesperti e principianti, tuttavia è facile per un raschietto inviare cookie. Se li usi e li richiedi, puoi tenere traccia delle azioni dell'utente e del raschiatore con loro e quindi implementare la limitazione della velocità, il blocco o la visualizzazione di captcha su un utente anziché su base IP.
Ad esempio: quando l'utente esegue la ricerca, imposta un cookie identificativo univoco. Quando vengono visualizzate le pagine dei risultati, verificare quel cookie. Se l'utente apre tutti i risultati della ricerca (si può dire dal cookie), probabilmente è un raschietto.
L'uso dei cookie può essere inefficace, poiché anche i raschiatori possono inviare i cookie con le loro richieste e scartarli secondo necessità. Impedirai inoltre l'accesso agli utenti reali che hanno disabilitato i cookie, se il tuo sito funziona solo con i cookie.
Si noti che se si utilizza JavaScript per impostare e recuperare il cookie, si bloccherà i raschiatori che non eseguono JavaScript, dal momento che non possono recuperare e inviare il cookie con la loro richiesta.
Usa JavaScript + Ajax per caricare i tuoi contenuti
È possibile utilizzare JavaScript + AJAX per caricare i contenuti dopo il caricamento della pagina stessa. Ciò renderà il contenuto inaccessibile ai parser HTML che non eseguono JavaScript. Questo è spesso un deterrente efficace per i programmatori inesperti e inesperti che scrivono raschietti.
Fare attenzione a:
L'uso di JavaScript per caricare il contenuto effettivo peggiorerà l'esperienza e le prestazioni dell'utente
Neanche i motori di ricerca possono eseguire JavaScript, impedendo loro di indicizzare i tuoi contenuti. Questo potrebbe non essere un problema per le pagine dei risultati di ricerca, ma potrebbe essere per altre cose, come le pagine degli articoli.
Offusca il markup, le richieste di rete dagli script e tutto il resto.
Se si utilizzano Ajax e JavaScript per caricare i dati, offuscare i dati trasferiti. Ad esempio, potresti codificare i tuoi dati sul server (con qualcosa di semplice come base64 o più complesso), quindi decodificarli e visualizzarli sul client, dopo il recupero tramite Ajax. Ciò significa che qualcuno che controlla il traffico di rete non vedrà immediatamente come funziona la tua pagina e carica i dati, e sarà più difficile per qualcuno richiedere direttamente i dati di richiesta dai tuoi endpoint, poiché dovranno decodificare il tuo algoritmo di decodifica.
Se usi Ajax per caricare i dati, dovresti rendere difficile usare gli endpoint senza caricare prima la pagina, ad esempio richiedendo una chiave di sessione come parametro, che puoi incorporare nel tuo JavaScript o HTML.
Puoi anche incorporare i tuoi dati offuscati direttamente nella pagina HTML iniziale e utilizzare JavaScript per deo-offuscarli e visualizzarli, evitando così le richieste di rete extra. In questo modo sarà molto più difficile estrarre i dati utilizzando un parser solo HTML che non esegue JavaScript, poiché quello che scrive lo scraper dovrà decodificare il tuo JavaScript (che dovresti anche offuscare).
Potresti voler cambiare regolarmente i tuoi metodi di offuscamento, per rompere i raschiatori che l'hanno capito.
Ci sono molti svantaggi nel fare qualcosa del genere, però:
Sarà noioso e difficile da implementare, mantenere e eseguire il debug.
Sarà inefficace contro i raschiatori e gli screenscraper che eseguono effettivamente JavaScript e quindi estraggono i dati. (Tuttavia, la maggior parte dei semplici parser HTML non esegue JavaScript)
Renderà il tuo sito non funzionante per utenti reali se JavaScript è disabilitato.
Le prestazioni e i tempi di caricamento della pagina ne risentiranno.
Non tecnico:
Di 'alla gente di non grattare, e alcuni la rispetteranno
Trova un avvocato
Rendi disponibili i tuoi dati, fornisci un'API:
Potresti rendere facilmente disponibili i tuoi dati e richiedere l'attribuzione e un link al tuo sito. Forse addebitare $$$ per questo.
Varie:
Esistono anche servizi di protezione della raschiatura commerciale, come l'anti-raschiatura di Cloudflare o Distill Networks (Dettagli su come funziona qui ), che fanno queste cose e altro ancora per te.
Trova un equilibrio tra usabilità per utenti reali e impermeabilità: tutto ciò che fai avrà un impatto negativo sull'esperienza dell'utente in un modo o nell'altro, trova compromessi.
Non dimenticare il tuo sito mobile e le tue app. Se si dispone di un'app mobile, anche questa può essere schermata e il traffico di rete può essere ispezionato per determinare gli endpoint REST che utilizza.
I raschiatori possono raschiare altri raschiatori: se c'è un sito Web che ha contenuti raschiati dai tuoi, altri raschiatori possono raschiare dal sito Web di quel raschietto.
Ulteriori letture: