En este HowTo explico como evitar la restricción de accesos de Cloudflare (Cloudflare’s anti-bot page), para así poder obtener información de servidores que usen dicha protección.
Cloudflare y DDoS
Para entender porqué se origina esta restricción de acceso, primero debemos conocer tres conceptos: Cloudflare
, DDoS
y Anti-Bot
.
Cloudflare
es un servicio de proxy inverso que proporciona protección DDoS. Está diseñado especialmente para aplicaciones web (HTTP y HTTPS), aunque también aporta protección para otros servicios como pueden ser FTP, SSH, etc …DDoS
es un ataque por denegación de servicio y su objetivo es inhabilitar un servidor. Básicamente lo que hace es saturar el ancho de banda o agotar los recursos de la máquina, impidiendo que pueda responder a más peticiones.Anti-Bot
, permite detectar ataques, denegando accesos que no sean humanos (bots).
Reproducción del problema
Vamos a reproducir el problema realizando una solicitud a un servidor con protección Cloudflare. Para ello utilizamos el módulo requests de Python.
1 2 3 4 |
import requests r = requests.get('https://www.domain.com/') print(r.text) |
Y lo que obtenemos es el siguiente resultado.
1 2 |
Access denied | www.domain.com used Cloudflare to restrict access Please enable cookies. |
El módulo cfscrape de Python
Para que el servidor no nos trate como un BOT, vamos a utilizar el módulo cloudflare-scrape
de Python en su versión 2.1.1.
1 |
$ pip install cfscrape |
Otra opción es instalar el módulo de Python cloudscraper, pero personalmente prefiero el primero, ya que su único requerimiento de dependencias es tener el módulo requests instalado, por lo que evitamos problemas si estamos corriendo una versión inferior de Python.
1 2 3 4 5 6 7 8 9 10 11 |
# pip show cfscrape Name: cfscrape Version: 2.1.1 Summary: A simple Python module to bypass Cloudflare's anti-bot page. See https://github.com/Anorov/cloudflare-scrape for more information. Home-page: https://github.com/Anorov/cloudflare-scrape Author: Anorov Author-email: anorov.vorona@gmail.com License: UNKNOWN Location: /usr/local/lib/python3.4/dist-packages Requires: requests Required-by: |
Modo de Uso
Tan sólo tenemos que importar el módulo y llamar al método create_scraper(). El resto funciona igual que el modo requests, por lo que cualquier petición que hagamos, evitará la protección anti Bots de Cloudflare.
1 2 3 4 5 |
import cfscrape scraper = cfscrape.create_scraper() r = scraper.get('https://www.domain.com/') print(r.text) |
Para poder tratar su contenido sin necesidad de realizar otra petición con cada ejecución, podemos guardarlo en un fichero.
1 2 3 |
html_file = './file.html' with open( html_file, '+w') as file: file.write(r.text) |
Si el fichero contiene HiperTexto (HTML), con el fin de conseguir la información, podemos filtrar su contenido utilizando el módulo de Python Beautiful Soup. Para obtener una documentación completa de este módulo podéis seguir el siguiente enlace.