2015-10-20 16 views
7

Ho usato di tanto in tanto per scansionare la pagina web di e-commerce per ottenere informazioni sui prezzi dei prodotti. Non ho usato il raschietto costruito usando Scrapy in un istante e ieri stavo cercando di usarlo - ho incontrato un problema con la protezione dei bot.Come bypassare cloudflare bot/protezione da ddos ​​in Scrapy?

Si sta utilizzando la protezione DDOS di CloudFlare che utilizza fondamentalmente la valutazione JavaScript per filtrare i browser (e quindi i raschietti) con JS disabilitato. Una volta valutata la funzione, viene generata la risposta con il numero calcolato. In cambio, il servizio restituisce due cookie di autenticazione che allegati a ciascuna richiesta consentono di eseguire normalmente la scansione del sito. Here è la descrizione di come funziona.

Ho anche trovato un modulo Python cloudflare-scrape che utilizza il motore di valutazione JS esterno per calcolare il numero e inviare la richiesta al server. Non sono sicuro di come integrarlo in Scrapy. O forse c'è un modo più intelligente senza usare l'esecuzione JS? Alla fine, è un modulo ...

Avrei bisogno di aiuto.

+0

Cosa c'è che non va nell'esecuzione del JS? molti contenuti non possono essere raggiunti senza di esso ... – dandavis

+0

@dandavis Scrapy non esegue l'esecuzione JS. – Rejected

+0

senza JS, lo scraping diventa sempre più inutile. dovresti considerare l'utilizzo di un browser per raschiare. i miei script di scrap possono andare dietro agli accessi, afferrare contenuti dinamici e impaginati, persino fare clic finti per richiedere sottotitoli più dinamici prima di fare scraping, e penso che non ci siano più di 10 righe di codice o che necessitino di una grande libreria esterna. tutto ciò di cui hai bisogno è tampermonkey e una routine di download ... KISS. se lo si desidera più automatizzato, è possibile passare l'usercript a PhantomJS o qualcosa del genere. – dandavis

risposta

4

Così ho eseguito JavaScript utilizzando Python con l'aiuto di cloudflare-scrape.

Per il vostro raschietto, è necessario aggiungere il seguente codice:

def start_requests(self): 
    cf_requests = [] 
    for url in self.start_urls: 
     token, agent = cfscrape.get_tokens(url, 'Your prefarable user agent, _optional_') 
     cf_requests.append(Request(url=url, 
         cookies={'__cfduid': token['__cfduid']}, 
         headers={'User-Agent': agent})) 
    return cf_requests 

fianco funzioni di parsing. E questo è tutto!

Naturalmente, è necessario installare prima cloudflare-scrape e importarlo sul proprio spider. È inoltre necessario installare un motore di esecuzione JS. Avevo già Node.JS, nessuna lamentela.

+0

Ciao, ho provato a utilizzare la soluzione per un sito Web utilizzando cloudflare. Sembra che venga inviata la richiesta giusta, ma sto ancora scadendo con 503 errori dalla prima richiesta. Ecco ciò che il reuqests assomigliano: 'DEBUG: "GET/cdn-cgi/l/chk_jschl jschl_answer = 386 & jschl_vc = 3ee197400dbcca30577bcb3949cf781f & pass = 1.446.694,346 mila?.755-esyN0f4s4% 2F HTTP/1.1 "302 165 DEBUG:" GET /forumdisplay.php?29-DotA-Chat HTTP/1.1 "200 21367' ' 2015-11-04 22:32:48 [scrapy] DEBUG: Ritornato (non riuscito 3 volte): 503 Servizio non disponibile' – ddnm

+0

@ddnm, ho aggiornato il codice. Funzionerà ora. Cambia 'cookies = {" cfuid ": token [" cfuid "]}' a 'cookies = token' –

1

Ovviamente il modo migliore per farlo sarebbe quello di autorizzare l'IP in CloudFlare; se questo non è adatto, mi raccomando la libreria cloudflare-scrape. Puoi utilizzare questo per ottenere il token cookie, quindi fornire questo token cookie nel tuo Scrapy request al server.

2

Se è giusto compromettere un po 'di velocità durante il processo di raschiatura, è possibile combinare Scrapy con Selenium per emulare un'interazione utente reale con il browser. Ho scritto un breve tutorial su di esso qui: http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python.

Non ha come obiettivo il problema specifico con CloudFlare, ma potrebbe essere utile poiché ho riscontrato problemi simili durante il caricamento dei dati necessari per l'esecuzione di JS.