Come posso evitare lo scraping del sito? [chiuso]


301

Ho un sito web di musica abbastanza grande con un ampio database di artisti. Ho notato altri siti musicali che raschiavano i dati del nostro sito (inserisco nomi fittizi di artisti qua e là e poi li cerco su Google).

Come posso evitare la raschiatura dello schermo? È anche possibile?


9
Hai mai pensato di provare a rilevare il loro raschietto tramite IP o simili (controlla i tuoi registri) e hai semplicemente falsificato i tuoi dati per quelli? In questo modo, sì, avrebbero "raschiato" il tuo sito, ma i loro "dati" sarebbero stati inutili.
Lasse V. Karlsen,

30
A testa in giù lecca lecca e testo invertito / criptato qualcuno?
Wayne Werner,



2
@JonasCz era uno scherzo ironico. La cosa triste è che una proposta simile è inclusa nella tua risposta, sebbene criticata.
Tomáš Zato - Ripristina Monica il

Risposte:


325

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 divcon 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-contentdiv 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-contentdiventa qualcosa di simile div.a4c36dda13eaf0e 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 divall'interno di una divche 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 divo 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.phpfare 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 styleattributo 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:


11
Questo mi ha portato qui. Una risposta davvero impressionante. Inoltre, una storia di revisione piuttosto sorprendente. Grazie per il post. Ottieni un voto. Non solo per la quantità di sforzi fatti, ma perché è utile per me.
DaveTheMinion,

1
Bella risposta! Ecco alcuni pensieri. A real browser will (almost always) request and download assets such as images and CSSvero anche per i lettori di accessibilità? CAPTCHA è rotto, quindi almeno i servizi professionali probabilmente non sono ostacolati da esso. L'uso dei cookie richiede notifica / consenso nell'UE. Find a balance between usability for real users and scraper-proofnessanche bilanciare tempo / complessità di programmazione rispetto ai benefici finanziari.
Eric J.

5
@JonH, se sono interessati, lo leggeranno. Inoltre, l'ho suddiviso in paragrafi con intestazioni e sottotitoli, in modo che le persone possano scansionarlo e leggere le parti che desiderano. In realtà ci sono alcune risposte altrettanto lunghe su SO, e la gente le legge.
JonasCz - Ripristina Monica il

2
@JoshCrozier - Penso solo che siti come questo non giochino bene con così tante informazioni. Non sto dicendo che le informazioni sono cattive.
JonH

2
PS Le mie impronte digitali steganografiche dell'idea di contenuto potrebbero essere utilizzate in un tribunale. Immagina lo shock quando provi che il possessore dei tuoi dati li ha ottenuti da te, attraverso le caratteristiche uniche direttamente nei dati ...
ErikE

241

Presumo che tu abbia installato robots.txt.

Come altri hanno già detto, i raschiatori possono falsificare quasi ogni aspetto delle loro attività ed è probabilmente molto difficile identificare le richieste che provengono dai cattivi.

Vorrei considerare:

  1. Imposta una pagina /jail.html,.
  2. Non consentire l'accesso alla pagina in robots.txt(quindi i ragni rispettosi non visiteranno mai).
  3. Posiziona un link su una delle tue pagine, nascondendolo con CSS ( display: none).
  4. Registrare gli indirizzi IP dei visitatori di /jail.html.

Questo potrebbe aiutarti a identificare rapidamente le richieste dei raschiatori che ignorano in modo flagrante il tuo robots.txt.

Si potrebbe anche voler rendere il vostro /jail.htmlun intero intero sito web che ha lo stesso, markup esattamente come pagine normali, ma con i dati falsi ( /jail/album/63ajdka, /jail/track/3aads8, ecc). In questo modo, i cattivi raschiatori non saranno avvisati di "input insoliti" fino a quando non avrai la possibilità di bloccarli completamente.


48
Ho già visto questa tecnica definita "honeypot". È una tecnica utilizzata anche nel filtro antispam, in cui si inserisce un indirizzo e-mail in una pagina ma lo si nasconde o si chiarisce che non è consentito alle persone inviare posta legittima. Quindi raccogliere l'indirizzo IP di qualsiasi server di posta che consegna posta a quell'indirizzo.
thomasrutter,

12
Ciò presuppone che si tratti di collegamenti per la scansione. La maggior parte dei raschiatori tenterà di inviare un modulo di qualche tipo e di raschiare i dati restituiti.
Byron Whitlock,

9
Ho visto honeypot basati su Perl per e-mail che contengono collegamenti ad altre "pagine" generate dallo script Perl. I robot legittimi che leggono robots.txt non lo guardano, ed è nascosto agli utenti tramite CSS, ma i raschiatori (o raccoglitori di e-mail) vengono rapidamente catturati in un albero di pagine di profondità infinita, il tutto con cattivi dati su di essi. Inserisci un link allo script proprio all'inizio di ciascuna delle tue pagine.
Stephen P

18
Un'altra cosa fantastica da lanciare per gli honeypot è il teergrubing (o tarpitting). Questa è una vecchia tecnica che adoro: quando identifichi un malintenzionato, sottoponi a scansione il suo processo di spamming / scraping mantenendo intenzionalmente aperte le sue connessioni il più a lungo possibile fisicamente senza scaderle. Naturalmente, questo potrebbe avvisarli che ci sei anche tu, ma cavolo dannazione è divertente. en.wikipedia.org/wiki/Teergrubing
womp

11
L'unico problema con questo approccio è se inserisco [img] yoursite / jail.html [/ img] su un forum popolare. Riceverai tonnellate di IP registrati nel tuo sistema e sarà difficile filtrare quale è quello cattivo. Se vuoi impedire questo tipo di cose, devi aggiungere un token associato con IP nell'URL. Qualcosa come jail.php? T = hoeyvm e nel database hai un'associazione di hoeyvm e l'IP che ha richiesto la pagina.
HoLyVieR,

48

Sue 'em.

Scherzi a parte: se hai un po 'di soldi, parla con un bravo, simpatico, giovane avvocato che conosce il modo per aggirare gli Internet. Potresti davvero essere in grado di fare qualcosa qui. A seconda di dove si trovano i siti, un avvocato potrebbe scrivere un cessate-il-lavoro o un suo equivalente nel vostro paese. Potresti riuscire almeno a spaventare i bastardi.

Documenta l'inserimento dei tuoi valori fittizi. Inserisci valori fittizi che indicano chiaramente (ma oscuramente) te. Penso che questa sia una pratica comune con le società di elenchi telefonici, e qui in Germania, penso che ci siano stati diversi casi in cui i copioni sono stati sballati attraverso voci false che hanno copiato 1: 1.

Sarebbe un peccato se questo ti spingesse a rovinare il tuo codice HTML, trascinando SEO, validità e altre cose (anche se un sistema di template che utilizza una struttura HTML leggermente diversa su ogni richiesta per pagine identiche potrebbe già aiutare molto contro Scraper che fanno sempre affidamento su strutture HTML e nomi di classi / ID per ottenere il contenuto.)

Casi come questo sono utili alle leggi sul copyright. Strappare il lavoro onesto di altre persone per fare soldi è qualcosa contro cui dovresti essere in grado di combattere.


9
funziona solo in paesi con solidi quadri giuridici.
TomL

3
Gli avvocati prosperano sul conflitto e ne traggono profitto. Raramente se mai un avvocato ti consiglierà di non andare in tribunale. Chiunque ti dirà che vincere e perdere non ha nulla a che fare con i concetti fini di "giustizia" se non gli argomenti, gli umori e le inclinazioni del giorno. Ricorda che se va storto, potresti essere responsabile non solo delle spese del tuo avvocato, ma anche delle altre parti, e se decidono di fare causa, beh. Potresti facilmente perdere la tua casa e qualsiasi altro bene nella tua vita. Non una scommessa che suggerirei. Ti consiglio di evitare i tribunali a tutti i costi.
Frankie,

3
Sono d'accordo con @TomL. Se sono in Occidente, è alquanto plausibile. Ma se sono in India / Cina / Russia / Ucraina / qualunque cosa - allora, sul serio, minimo o nessuna possibilità. Posso dire dei tribunali russi: non si preoccuperanno nemmeno di lavorare con le tue affermazioni.
Highstaker,

35

Non c'è davvero niente che tu possa fare per impedirlo completamente. I raschiatori possono falsificare il proprio agente utente, utilizzare più indirizzi IP, ecc. E apparire come un normale utente. L'unica cosa che puoi fare è rendere il testo non disponibile al momento del caricamento della pagina: crealo con immagini, flash o caricalo con JavaScript. Tuttavia, i primi due sono idee sbagliate e l'ultimo sarebbe un problema di accessibilità se JavaScript non fosse abilitato per alcuni dei tuoi utenti regolari.

Se stanno assolutamente sbattendo il tuo sito e sfogliando tutte le tue pagine, potresti fare una sorta di limitazione della velocità.

C'è qualche speranza però. I raschiatori si affidano al fatto che i dati del tuo sito siano in un formato coerente. Se potessi randomizzarlo in qualche modo, potrebbe rompere il loro raschietto. Cose come cambiare l'ID o i nomi delle classi degli elementi della pagina su ogni carico, ecc. Ma è un sacco di lavoro da fare e non sono sicuro che ne valga la pena. E anche allora, probabilmente potrebbero aggirarlo con sufficiente dedizione.


14
La creazione di un sistema che limita il numero di pagine che un IP può visualizzare al minuto è un buon trucco, poiché i raschiatori dello schermo attraverseranno il sito molto più velocemente di qualsiasi persona normale.
TravisO,

Concordato. Gli IP costano denaro e sono limitati dalla maggior parte delle società di hosting.
Tal Weiss,

ri: "Cose come cambiare l'ID o i nomi delle classi degli elementi della pagina su ogni carico, ecc." Non è così male se crei un nome di classe tramite PHP e poi usi <div class = "<? Php echo $ myPHPGeneratedClassName;?>"> Potresti persino usare stringhe casuali in esso per renderlo completamente unico. Tutto ciò che impedisce loro di trovare schemi rende molto più difficile analizzare il DOM.
negri

Non è difficile trovare un IP. Ci sono molti proxy, amici computer, computer di lavoro, computer scolastici, computer di biblioteca ...
Incognito

@ user257493: Vero, ma stiamo parlando di qualcuno che sta raccogliendo dati qui. Le probabilità sono che non si ha intenzione di andare in che molto sforzo solo per i dati di raccolta. E se lo fanno, alla fine esaurirai la loro offerta di IP.
ryeguy,

31

Fornire un'API XML per accedere ai tuoi dati; in un modo semplice da usare. Se le persone vogliono i tuoi dati, li otterranno, potresti anche fare di tutto.

In questo modo è possibile fornire un sottoinsieme di funzionalità in modo efficace, garantendo che, per lo meno, i raschiatori non intacchino richieste HTTP e enormi quantità di larghezza di banda.

Quindi tutto ciò che devi fare è convincere le persone che desiderano che i tuoi dati utilizzino l'API. ;)


3
Questo sembra molto ragionevole. La raschiatura dello schermo è dannatamente difficile da prevenire e, se si fornisce un'API, è possibile porre alcune restrizioni su di essa, aggiungere avvisi ("Contenuto da ----.com") e fondamentalmente controllare quali dati vengono forniti.
alecwh,

6
@alecwh: e addebito per l'accesso!
André Caron,

3
Ti ho assegnato la generosità, in parte perché il Web sarebbe molto meglio se ogni sito web lo facesse. Speriamo che diventi più comune.
JonasCz - Ripristina Monica

1
Non appena li fai iscrivere al servizio, torneranno al sito normale
mplungjan,

Sono una di queste persone dalla parte opposta di questa conversazione. Costruisco modelli per spettacoli di Broadway e devo raschiare tutti i miei dati piuttosto che accedervi in ​​modo ordinato.
Yaakov Bressler,

22

Scusa, è davvero abbastanza difficile farlo ...

Suggerirei cortesemente di chiedere loro di non utilizzare il contenuto (se il contenuto è protetto da copyright).

Se lo è e non lo abbattono, allora puoi agire di furthur e inviare loro una lettera di cessazione e desistere .

In generale, qualsiasi cosa tu faccia per prevenire la raschiatura probabilmente finirà con un effetto più negativo, ad esempio accessibilità, robot / ragni, ecc.


12

Va bene, come dicono tutti i post, se vuoi renderlo compatibile con i motori di ricerca, i robot possono raschiare di sicuro.

Ma puoi ancora fare alcune cose e potrebbe essere efficace per il 60-70% di robot raschiatori.

Crea uno script checker come di seguito.

Se un determinato indirizzo IP sta visitando molto velocemente, dopo alcune visite (5-10) inserisci il suo indirizzo IP + le informazioni del browser in un file o database.

Il prossimo passo

(Questo sarebbe un processo in background e in esecuzione tutto il tempo o programmato dopo alcuni minuti.) Crea uno script che continuerà a controllare quegli indirizzi IP sospetti.

Caso 1. Se l'agente utente appartiene a un motore di ricerca noto come Google, Bing , Yahoo (è possibile trovare ulteriori informazioni sugli agenti utente cercandoli su Google ). Quindi devi visitare http://www.iplists.com/ . Questo elenco e cerca di abbinare i modelli. E se sembra un falso user-agent, allora chiedi di compilare un CAPTCHA alla visita successiva. (Devi cercare un po 'di più sugli indirizzi IP dei robot. So che questo è realizzabile e provare anche chi è l'indirizzo IP. Può essere utile.)

Caso 2. Nessun agente utente di un bot di ricerca: basta chiedere di inserire un CAPTCHA alla visita successiva.


+1 L'utilizzo di iplists.com è un'ottima idea
Daniel Trebbien,

10

Risposta tardiva - e anche questa risposta probabilmente non è quella che vuoi sentire ...

Io stesso ho già scritto molte (molte decine) di diversi specialisti scraper di data mining . (solo perché mi piace la filosofia "open data").

Qui ci sono già molti consigli in altre risposte - ora giocherò il ruolo di avvocato del diavolo e estenderò e / o correggerò la loro efficacia.

Primo:

  • se qualcuno davvero vuole tuoi dati
  • non puoi efficacemente (tecnicamente) nascondere i tuoi dati
  • se i dati devono essere accessibili al pubblico ai tuoi "utenti regolari"

Cercare di utilizzare alcune barriere tecniche non vale i problemi, causati:

  • ai tuoi utenti regolari peggiorando la loro esperienza utente
  • ai robot regolari e benvenuti (motori di ricerca)
  • eccetera...

HMTL semplice: il modo più semplice è analizzare le pagine HTML semplici, con struttura e classi css ben definite. Ad esempio, è sufficiente ispezionare l'elemento con Firebug e utilizzare gli Xpaths giusti e / o il percorso CSS nel mio raschietto.

È possibile generare la struttura HTML in modo dinamico e inoltre, è possibile generare dinamicamente i nomi di classe CSS (e anche il CSS stesso) (ad esempio utilizzando alcuni nomi di classe casuali) - ma

  • vuoi presentare le informazioni ai tuoi utenti abituali in modo coerente
  • ad es. di nuovo: è sufficiente analizzare nuovamente la struttura della pagina per impostare il raschietto.
  • e può essere fatto automaticamente analizzando alcuni "contenuti già noti"
    • una volta che qualcuno lo sa già (con una raschiatura precedente), ad esempio:
    • cosa contiene le informazioni su "phil collins"
    • basta visualizzare la pagina "phil collins" e (automaticamente) analizzare come è strutturata la pagina "oggi" :)

Non puoi cambiare la struttura per ogni risposta, perché i tuoi utenti regolari ti odieranno. Inoltre, questo causerà più problemi per te (manutenzione) non per il raschietto. Il percorso XPath o CSS è determinabile dallo script di scraping automaticamente dal contenuto noto.

Ajax - un po 'più difficile all'inizio, ma molte volte accelera il processo di raschiatura :) - perché?

Quando analizzo le richieste e le risposte, ho appena impostato il mio server proxy (scritto in perl) e il mio Firefox lo sta usando. Ovviamente, poiché è il mio proxy - è completamente nascosto - il server di destinazione lo vede come un normale browser. (Quindi, nessuna X-Forwarded-for e tali intestazioni). Sulla base dei log del proxy, per lo più è possibile determinare la "logica" delle richieste ajax, ad es. Potrei saltare la maggior parte dello scraping html e usare solo le risposte ajax ben strutturate (principalmente in formato JSON).

Quindi, l' ajax non aiuta molto ...

Alcune più complicate sono le pagine che utilizzano funzioni javascript molto piene .

Qui è possibile utilizzare due metodi di base:

  • decomprimere e comprendere JS e creare un raschietto che segua la logica Javascript (nel modo più duro)
  • o (preferibilmente usando da solo) - semplicemente usando Mozilla con Mozrepl per raschiare. Ad esempio, il vero scraping viene eseguito nel browser abilitato javascript completo, che è programmato per fare clic sugli elementi giusti e semplicemente afferrare le risposte "decodificate" direttamente dalla finestra del browser.

Tale raschiatura è lenta (la raschiatura viene eseguita come nel normale browser), ma lo è

  • molto facile da configurare e utilizzare
  • ed è quasi impossibile contrastarlo :)
  • e la "lentezza" è comunque necessaria per contrastare il "blocco delle richieste rapide basate sullo stesso IP"

Il filtro basato su User-Agent non aiuta affatto. Qualsiasi serio minatore di dati lo imposterà su uno corretto nel suo raschietto.

Richiedi accesso - non aiuta. Il modo più semplice per batterlo (senza alcuna analisi e / o scripting del protocollo di accesso) è semplicemente accedere al sito come utente normale, usando Mozilla e dopo aver appena eseguito lo scraper basato su Mozrepl ...

Ricorda, il login richiesto aiuta per i bot anonimi, ma non aiuta contro qualcuno che vuole raschiare i tuoi dati. Si registra semplicemente sul tuo sito come utente normale.

Anche l'uso dei frame non è molto efficace. Questo è usato da molti servizi di film dal vivo e non è molto difficile da battere. I frame sono semplicemente altre pagine HTML / Javascript che sono necessarie per analizzare ... Se i dati valgono i problemi - il minatore di dati farà l'analisi richiesta.

La limitazione basata su IP non è affatto efficace - qui ci sono troppi server proxy pubblici e anche qui c'è il TOR ... :) Non rallenta lo scraping (per qualcuno che vuole davvero i tuoi dati).

Molto difficile è raschiare i dati nascosti nelle immagini. (es. semplicemente convertendo i dati in immagini lato server). L'impiego di "tesseract" (OCR) aiuta molte volte - ma onestamente - i dati devono valere i problemi per il raschietto. (che molte volte non vale).

Dall'altro lato, i tuoi utenti ti odieranno per questo. Io stesso (anche se non raschiando) odio i siti Web che non consentono di copiare il contenuto della pagina negli Appunti (perché le informazioni sono nelle immagini o (quelle sciocche) che cercano di legare al clic destro alcuni eventi Javascript personalizzati.: )

I più difficili sono i siti che utilizzano applet Java o Flash e l'applet utilizza internamente richieste https sicure . Ma pensaci due volte: quanto saranno felici gli utenti del tuo iPhone ...;). Pertanto, attualmente pochissimi siti li utilizzano. Io stesso, bloccando tutto il contenuto Flash nel mio browser (in normali sessioni di navigazione) e non usando mai siti che dipendono da Flash.

I tuoi traguardi potrebbero essere ..., quindi puoi provare questo metodo - ricorda solo - probabilmente perderai alcuni dei tuoi utenti. Ricorda inoltre che alcuni file SWF sono decompilabili. ;)

Captcha (quelli buoni - come reCaptcha) aiuta molto - ma i tuoi utenti ti odieranno ... - immagina come i tuoi utenti ti ameranno quando dovranno risolvere alcuni captcha in tutte le pagine che mostrano informazioni sugli artisti della musica.

Probabilmente non è necessario continuare: sei già entrato nella foto.

Ora cosa dovresti fare:

Ricorda: è quasi impossibile nascondere i tuoi dati, se dall'altra parte vuoi pubblicarli (in modo amichevole) per i tuoi utenti normali.

Così,

  • rendere i tuoi dati facilmente accessibili - tramite alcune API
    • questo consente un facile accesso ai dati
    • ad esempio, scaricare il server dallo scraping: un vantaggio per te
  • impostare i diritti di utilizzo corretti (ad esempio, ad esempio, deve citare la fonte)
  • ricorda, molti dati non sono protetti da copyright e difficile proteggerli
  • aggiungi alcuni dati falsi (come hai già fatto) e usa strumenti legali
    • come altri hanno già detto, invia una "lettera di cessazione e desistere"
    • altre azioni legali (cause e simili) probabilmente sono troppo costose e difficili da vincere (specialmente contro siti non statunitensi)

Pensaci due volte prima di provare ad usare alcune barriere tecniche.

Piuttosto che provare a bloccare i data mining, basta aggiungere ulteriori sforzi all'usabilità del tuo sito web. Il tuo utente ti adorerà. Il tempo (e l'energia) investito in barriere tecniche di solito non vale - meglio dedicare del tempo per rendere il sito Web ancora migliore ...

Inoltre, i ladri di dati non sono come i ladri normali.

Se acquisti un allarme domestico economico e aggiungi un avviso "questa casa è collegata alla polizia" - molti ladri non proveranno nemmeno a entrare. Perché una mossa sbagliata da parte sua - e andrà in prigione ...

Quindi, stai investendo solo pochi dollari, ma il ladro investe e rischi molto.

Ma il ladro di dati non ha tali rischi. esattamente il contrario: se fai una mossa sbagliata (ad es. se introduci un BUG a causa di ostacoli tecnici), perderai i tuoi utenti. Se il robot di scraping non funzionerà per la prima volta, non succede nulla: il data-miner proverà semplicemente un altro approccio e / o eseguirà il debug dello script.

In questo caso, devi investire molto di più - e il raschietto investe molto meno.

Pensa solo dove vuoi investire il tuo tempo ed energia ...

Ps: l'inglese non è il mio nativo - quindi perdona il mio inglese rotto ...


@Parapluie Dovresti davvero leggere i contenuti gratuiti e / o il modello Open source : informazioni su date, storia, obiettivi ed etica. E soprattutto riguardo agli Open Data - per i quali ho creato la maggior parte dei miei raschietti ...
jm666

Capisco il concetto, anche se ti ringrazio per i tuoi eruditi consigli. Avremmo potuto avere una conversazione interessante a riguardo; ma sembra che il mio commento originale sia stato eliminato da una terza parte. E così, siamo davvero liberi dopo tutto?
Parapluie,

8

Dal punto di vista tecnico: modella solo quello che fa Google quando li colpisci con troppe query contemporaneamente. Ciò dovrebbe fermare molto.

Dal punto di vista legale: sembra che i dati che stai pubblicando non siano proprietari. Significa che stai pubblicando nomi e statistiche e altre informazioni che non possono essere protette da copyright.

In questo caso, i raschiatori non violano il copyright ridistribuendo le informazioni sul nome dell'artista, ecc. Tuttavia, potrebbero violare il copyright quando caricano il tuo sito in memoria perché il sito contiene elementi che possono essere protetti da copyright (come layout, ecc.).

Consiglio di leggere su Facebook v. Power.com e di vedere gli argomenti usati da Facebook per interrompere lo scraping dello schermo. Esistono molti modi legali per tentare di impedire a qualcuno di eliminare il tuo sito Web. Possono essere di vasta portata e fantasiosi. A volte i tribunali acquistano gli argomenti. A volte no.

Ma, supponendo che stai pubblicando informazioni di dominio pubblico che non sono tutelabili come nomi e statistiche di base ... dovresti semplicemente lasciarle andare in nome della libertà di parola e dei dati aperti. Cioè, di cosa tratta il web.


1
Anche se potresti non essere in grado di proteggere il copyright delle informazioni, puoi sicuramente mettere una clausola contro lo scrap nei termini di utilizzo. Quindi, inviare una lettera di cessazione e desistere per violazione dei termini di utilizzo.
André Caron,

1
La libertà di parola e dati aperti è davvero lo spirito di Internet!
Ciara,

Sì, libertà di parola e tutto il resto. Tuttavia, è possibile che gli scraper stiano sprecando una quantità significativa del budget o della banda dell'OP, oltre a copiare dati non difendibili.
jpaugh

8

Cose che potrebbero funzionare contro i raschiatori per principianti:

  • Blocco IP
  • usa un sacco di ajax
  • controlla intestazione richiesta referer
  • richiede il login

Cose che aiuteranno in generale:

  • cambia il layout ogni settimana
  • robots.txt

Cose che aiuteranno ma che faranno odiare i tuoi utenti:

  • captcha

8

Ho fatto un sacco di web scraping e ho riassunto alcune tecniche per fermare i web raschiatori sul mio blog in base a ciò che trovo fastidioso.

È un compromesso tra utenti e utenti. Se limiti gli IP, usa CAPTCHA, richiedi l'accesso, ecc., Ti rendi difficile per i raschiatori. Ma questo potrebbe anche allontanare i tuoi utenti reali.


8

Sfortunatamente l'opzione migliore è abbastanza manuale: cerca schemi di traffico che ritieni indicativi di scraping e vietare i loro indirizzi IP.

Dal momento che stai parlando di un sito pubblico, rendere il sito amichevole per i motori di ricerca renderà anche il sito intuitivo. Se un motore di ricerca è in grado di eseguire la scansione e la demolizione del tuo sito, anche uno scraper dannoso può farlo. È una linea sottile da camminare.


4
Il blocco IP rallenta lo scraper ma è anche molto lavoro per il tuo server. Diciamo che ti grido con 1000 proxy, ho ancora i dati che desidero e ora il tuo firewall è un casino.
pguardiario,

1
Quando lo farai, saranno orizzontali su di te. 100000 indirizzi oggi non costano nulla per loro ma rallentano il tuo sito se provi a vietarli tutti - e ruoteranno gli IP per non visitarli più di una volta o due volte
mplungjan

6

Certo che è possibile. Per il 100% di successo, porta il tuo sito offline.

In realtà puoi fare alcune cose che rendono il raschiare un po 'più difficile. Google esegue i controlli del browser per assicurarsi che non sei un robot che gratta i risultati della ricerca (anche se questo, come quasi tutto il resto, può essere falsificato).

Puoi fare cose come richiedere alcuni secondi tra la prima connessione al tuo sito e i clic successivi. Non sono sicuro di quale sarebbe il momento ideale o esattamente come farlo, ma questa è un'altra idea.

Sono sicuro che ci sono molte altre persone che hanno molta più esperienza, ma spero che queste idee siano almeno un po 'utili.


6

Ci sono alcune cose che puoi fare per cercare di prevenire lo scraping dello schermo. Alcuni non sono molto efficaci, mentre altri (un CAPTCHA) lo sono, ma ostacolano l'usabilità. Devi anche tenere presente che potrebbe ostacolare i legittimi raschiatori di siti, come gli indici dei motori di ricerca.

Tuttavia, suppongo che se non lo si desidera raschiare, ciò significa che non si desidera indicizzare neanche i motori di ricerca.

Ecco alcune cose che puoi provare:

  • Mostra il testo in un'immagine. Questo è abbastanza affidabile, ed è meno doloroso per l'utente di un CAPTCHA, ma significa che non saranno in grado di tagliare e incollare e non si ridimensioneranno graziosamente o saranno accessibili.
  • Utilizzare un CAPTCHA e richiederne il completamento prima di restituire la pagina. Questo è un metodo affidabile, ma anche il più grande dolore da imporre a un utente.
  • Richiede all'utente di registrarsi per un account prima di visualizzare le pagine e confermare il proprio indirizzo e-mail. Questo sarà piuttosto efficace, ma non del tutto - uno screen-scraper potrebbe creare un account e programmare in modo intelligente il loro script per accedere.
  • Se la stringa dell'agente utente del client è vuota, bloccare l'accesso. Uno script di scraping del sito viene spesso programmato pigramente e non imposta una stringa agente utente, mentre tutti i browser Web lo faranno.
  • È possibile impostare una lista nera di stringhe di agente utente dello screen scraper conosciute quando vengono rilevate. Ancora una volta, questo aiuterà solo quelli codificati pigramente; un programmatore che sa cosa sta facendo può impostare una stringa user-agent per impersonare un browser web.
  • Cambia spesso il percorso dell'URL. Quando lo cambi, assicurati che quello vecchio continui a funzionare, ma solo fino a quando è probabile che un utente abbia il browser aperto. Rendi difficile prevedere quale sarà il nuovo percorso URL. Questo renderà difficile per gli script afferrarlo se il loro URL è hard-coded. Sarebbe meglio farlo con una specie di sceneggiatura.

Se dovessi farlo, probabilmente userei una combinazione degli ultimi tre, perché minimizzano il disagio per gli utenti legittimi. Tuttavia, dovresti accettare che non sarai in grado di bloccare tutti in questo modo e una volta che qualcuno capirà come aggirarlo, sarà in grado di raschiarlo per sempre. Potresti quindi provare a bloccare i loro indirizzi IP mentre li scopri immagino.


6
  1. No, non è possibile fermarsi (in alcun modo)
  2. Abbraccialo. Perché non pubblicare come RDFa e diventare super motore di ricerca amichevole e incoraggiare il riutilizzo dei dati? Le persone ti ringrazieranno e ti daranno credito quando dovuto (vedi musicbrainz come esempio).

Non è la risposta che probabilmente vorresti, ma perché nascondere ciò che stai cercando di rendere pubblico?


5

Metodo 1 (solo siti di piccole dimensioni):
servire dati crittografati / codificati.
Scape il web usando Python (urllib, richieste, beautifulSoup ecc ...) e ho trovato molti siti Web che offrono dati crittografati / codificati che non sono decifrabili in nessun linguaggio di programmazione semplicemente perché il metodo di crittografia non esiste.

Ho raggiunto questo obiettivo in un sito Web di PHP crittografando e minimizzando l'output (ATTENZIONE: questa non è una buona idea per i siti di grandi dimensioni) la risposta è stata sempre un contenuto confuso.

Esempio di minimizzazione dell'output in PHP ( Come minimizzare l'output html della pagina php? ):

<?php
  function sanitize_output($buffer) {
    $search = array(
      '/\>[^\S ]+/s', // strip whitespaces after tags, except space
      '/[^\S ]+\</s', // strip whitespaces before tags, except space
      '/(\s)+/s'      // shorten multiple whitespace sequences
    );
    $replace = array('>', '<', '\\1');
    $buffer = preg_replace($search, $replace, $buffer);
    return $buffer;
  }
  ob_start("sanitize_output");
?>

Metodo due:
se non riesci a fermarli, falli rispondere come dati falsi / inutili come risposta.

Metodo tre:
blocca i comuni agenti utente di scraping, lo vedrai in siti Web grandi / grandi in quanto è impossibile grattarli con "python3.4" come User-Agent.

Metodo quattro:
assicurati che tutte le intestazioni dell'utente siano valide, a volte fornisco quante più intestazioni possibili per far sembrare il mio raschietto un utente autentico, alcune di esse non sono nemmeno vere o valide come en-FU :).
Ecco un elenco di alcune delle intestazioni che fornisco comunemente.

headers = {
  "Requested-URI": "/example",
  "Request-Method": "GET",
  "Remote-IP-Address": "656.787.909.121",
  "Remote-IP-Port": "69696",
  "Protocol-version": "HTTP/1.1",
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  "Accept-Encoding": "gzip,deflate",
  "Accept-Language": "en-FU,en;q=0.8",
  "Cache-Control": "max-age=0",
  "Connection": "keep-alive",
  "Dnt": "1",  
  "Host": "http://example.com",
  "Referer": "http://example.com",
  "Upgrade-Insecure-Requests": "1",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"
}

2

Invece di inserire nella lista nera i robot, forse dovresti inserirli nella whitelist. Se non si desidera eliminare i risultati della ricerca per i primi motori, è possibile autorizzare le loro stringhe di user-agent, che sono generalmente ben pubblicizzate. I bot meno etici tendono a creare stringhe di user-agent dei browser Web più diffusi. I primi motori di ricerca dovrebbero aumentare del 95% del traffico.

L'identificazione dei robot stessi dovrebbe essere abbastanza semplice, usando le tecniche suggerite da altri poster.


2

Un rapido approccio a questo sarebbe quello di impostare una trappola booby / bot.

  1. Crea una pagina che se viene aperta un certo numero di volte o addirittura aperta, raccoglierà determinate informazioni come l'IP e quant'altro (puoi anche considerare irregolarità o schemi ma questa pagina non dovrebbe essere affatto aperta).

  2. Crea un collegamento a questo nella tua pagina che è nascosto con la visualizzazione CSS: nessuno; o a sinistra: -9999px; positon: absolute; prova a posizionarlo in luoghi in cui è meno improbabile che venga ignorato, ad esempio dove si trovano i tuoi contenuti e non il tuo piè di pagina, poiché a volte i robot possono scegliere di dimenticare alcune parti di una pagina.

  3. Nel tuo file robots.txt imposta un sacco di regole di non consentire alle pagine che non vuoi che i robot amici (LOL, come se avessero facce felici!) Per raccogliere informazioni e impostare questa pagina come una di esse.

  4. Ora, se passa un bot amico, dovrebbe ignorare quella pagina. Giusto ma non è ancora abbastanza buono. Crea un altro paio di queste pagine o in qualche modo reindirizza una pagina per accettare nomi diversi. e quindi inserisci ulteriori regole di non consentire a queste pagine trap nel file robots.txt accanto alle pagine che desideri ignorare.

  5. Raccogli l'IP di questi robot o chiunque entri in queste pagine, non vietarli, ma esegui una funzione per visualizzare il testo sfogliato nei tuoi contenuti come numeri casuali, avvisi di copyright, stringhe di testo specifiche, visualizzare immagini spaventose, praticamente qualsiasi cosa per ostacolare il tuo buon contenuto. Puoi anche impostare collegamenti che puntano a una pagina che impiegherà un'eternità a caricarsi, ad es. in php puoi usare la funzione sleep (). Questo reagirà al crawler se ha una sorta di rilevamento per bypassare le pagine che impiegano troppo tempo a caricarsi poiché alcuni robot ben scritti sono impostati per elaborare X quantità di collegamenti alla volta.

  6. Se hai creato stringhe / frasi di testo specifiche, perché non andare al tuo motore di ricerca preferito e cercarle, potrebbe mostrarti dove finiscono i tuoi contenuti.

Comunque, se pensi tatticamente e in modo creativo, questo potrebbe essere un buon punto di partenza. La cosa migliore da fare sarebbe imparare come funziona un bot.

Penserei anche di scambiare alcuni ID o il modo in cui vengono visualizzati gli attributi sull'elemento della pagina:

<a class="someclass" href="../xyz/abc" rel="nofollow" title="sometitle"> 

che cambia forma ogni volta che alcuni robot potrebbero essere impostati per cercare schemi specifici nelle tue pagine o elementi mirati.

<a title="sometitle" href="../xyz/abc" rel="nofollow" class="someclass"> 

id="p-12802" > id="p-00392"

1
Non vuoi solo vietarli, vuoi fotterli completamente ... LO ADORO!
Zoidberg,

Il divieto di invisibilità è esattamente ciò a cui stavo pensando (alias Shadowbanning, Hell Banning).
ErikE,

1

Non è possibile interrompere il normale raschiamento dello schermo. Nel bene e nel male, è la natura del web.

È possibile fare in modo che nessuno possa accedere certe cose (compresi file musicali) a meno che non è registrato come utente registrato. Non è troppo difficile da fare in Apache . Presumo che non sarebbe troppo difficile farlo anche in IIS.


1

Un modo sarebbe quello di servire il contenuto come attributi XML, stringhe codificate URL, testo preformattato con JSON codificato HTML o URI di dati, quindi trasformarlo in HTML sul client. Ecco alcuni siti che fanno questo:

  • Skechers : XML

    <document 
     filename="" 
     height="" 
     width="" 
     title="SKECHERS" 
     linkType="" 
     linkUrl="" 
     imageMap="" 
     href=&quot;http://www.bobsfromskechers.com&quot; 
     alt=&quot;BOBS from Skechers&quot; 
     title=&quot;BOBS from Skechers&quot; 
    />
  • Chrome Web Store : JSON

    <script type="text/javascript" src="https://apis.google.com/js/plusone.js">{"lang": "en", "parsetags": "explicit"}</script>
  • Notizie Bing : URL dei dati

    <script type="text/javascript">
      //<![CDATA[
      (function()
        {
        var x;x=_ge('emb7');
        if(x)
          {
          x.src='data:image/jpeg;base64,/*...*/';
          } 
        }() )
  • Protopage : stringhe codificate URL

    unescape('Rolling%20Stone%20%3a%20Rock%20and%20Roll%20Daily')
  • TiddlyWiki : Entità HTML + JSON preformattato

       <pre>
       {&quot;tiddlers&quot;: 
        {
        &quot;GettingStarted&quot;: 
          {
          &quot;title&quot;: &quot;GettingStarted&quot;,
          &quot;text&quot;: &quot;Welcome to TiddlyWiki,
          }
        }
       }
       </pre>
  • Amazon : caricamento lento

    amzn.copilot.jQuery=i;amzn.copilot.jQuery(document).ready(function(){d(b);f(c,function() {amzn.copilot.setup({serviceEndPoint:h.vipUrl,isContinuedSession:true})})})},f=function(i,h){var j=document.createElement("script");j.type="text/javascript";j.src=i;j.async=true;j.onload=h;a.appendChild(j)},d=function(h){var i=document.createElement("link");i.type="text/css";i.rel="stylesheet";i.href=h;a.appendChild(i)}})();
    amzn.copilot.checkCoPilotSession({jsUrl : 'http://z-ecx.images-amazon.com/images/G/01/browser-scripts/cs-copilot-customer-js/cs-copilot-customer-js-min-1875890922._V1_.js', cssUrl : 'http://z-ecx.images-amazon.com/images/G/01/browser-scripts/cs-copilot-customer-css/cs-copilot-customer-css-min-2367001420._V1_.css', vipUrl : 'https://copilot.amazon.com'
  • XMLCalabash : XML con spaziatura dei nomi + tipo MIME personalizzato + estensione file personalizzato

       <p:declare-step type="pxp:zip">
            <p:input port="source" sequence="true" primary="true"/>
            <p:input port="manifest"/>
            <p:output port="result"/>
            <p:option name="href" required="true" cx:type="xsd:anyURI"/>
            <p:option name="compression-method" cx:type="stored|deflated"/>
            <p:option name="compression-level" cx:type="smallest|fastest|default|huffman|none"/>
            <p:option name="command" select="'update'" cx:type="update|freshen|create|delete"/>
       </p:declare-step>

Se visualizzi la fonte su uno dei precedenti, vedi che lo scraping restituirà semplicemente metadati e navigazione.


Quindi ... questo approccio rende ancora più semplice lo scraping, poiché il contenuto è ora in un formato uniforme. In realtà, non si chiamerebbe più raschiare : si chiama analisi ed è davvero molto facile da fare a livello di programmazione.
jpaugh

1

La maggior parte è già stata detta, ma hai considerato la protezione CloudFlare? Intendo questo:

descrizione dell'immagine

Probabilmente lo fanno anche altre aziende, CloudFlare è l'unica che conosco.

Sono abbastanza sicuro che complicherebbe il loro lavoro. Una volta ho anche escluso automaticamente l'IP per 4 mesi quando ho provato a scartare i dati di un sito protetto da CloudFlare a causa del limite di velocità (ho usato un semplice ciclo di richieste AJAX).


1

Sono d'accordo con la maggior parte dei post di cui sopra e vorrei aggiungere che più il tuo sito è amico dei motori di ricerca, più è scaricabile. Potresti provare a fare un paio di cose che sono molto là fuori che rendono più difficile per i raschiatori, ma potrebbe anche influenzare la tua capacità di ricerca ... Dipende da quanto vuoi che il tuo sito si classifichi sui motori di ricerca, ovviamente.


0

Mettere i tuoi contenuti dietro un captcha significherebbe che i robot avrebbero difficoltà ad accedere ai tuoi contenuti. Tuttavia, gli umani verrebbero scomodati e ciò potrebbe essere indesiderabile.


0

Se vuoi vedere un ottimo esempio, dai un'occhiata a http://www.bkstr.com/ . Usano l'algoritmo aj / s per impostare un cookie, quindi ricaricano la pagina in modo che possa utilizzare il cookie per convalidare l'esecuzione della richiesta all'interno di un browser. Un'app desktop creata per raschiare potrebbe sicuramente farcela, ma fermerebbe la maggior parte dei raschiamenti di tipo cURL.


0

I raschiatori funzionano elaborando HTML. E se sono determinati a ottenere i tuoi dati, non c'è molto che tu possa fare tecnicamente perché il bulbo oculare umano elabora qualsiasi cosa. Legalmente è già stato sottolineato che potresti comunque fare ricorso e questa sarebbe la mia raccomandazione.

Tuttavia, è possibile nascondere la parte critica dei dati utilizzando una logica di presentazione non basata su HTML

  • Genera un file Flash per ogni artista / album, ecc.
  • Genera un'immagine per ogni contenuto dell'artista. Forse sarebbe sufficiente solo un'immagine per il nome dell'artista, ecc. A tale scopo, esegui il rendering del testo in un file JPEG / PNG sul server e il collegamento a tale immagine.

Tieni presente che ciò influirebbe probabilmente sulla tua classifica di ricerca.


0

Genera HTML, CSS e JavaScript. È più facile scrivere generatori che parser, quindi potresti generare ogni pagina servita in modo diverso. Quindi non è più possibile utilizzare una cache o contenuto statico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.