Scrapy vs Pyspider: ¿Cuál es mejor para Web Scraping?

Compare Scrapy vs Pyspider para web scraping y elija la mejor herramienta para sus necesidades de web scraping.
13 min de lectura
Scrapy vs Pyspider blog image

En esta guía Scrapy vs Pyspider, aprenderás:

  • Qué son Scrapy y Pyspider
  • Comparación entre Scrapy y Pyspider para el web scraping
  • Cómo utilizar Scrapy y Pyspider para el web scraping
  • Limitaciones comunes entre Scrapy y Pyspider en escenarios de web scraping

Sumerjámonos.

¿Qué es Scrapy?

Scrapy es un framework de scraping web de código abierto escrito en Python. Su principal objetivo es extraer datos de sitios web de forma rápida y eficaz. En detalle, le permite:

  • Definir cómo navegar y recopilar información de una o varias páginas web.
  • Gestione aspectos como las solicitudes HTTP, el seguimiento de enlaces y la extracción de datos.
  • Evite las prohibiciones ajustando la velocidad de las solicitudes con estrangulamiento y solicitudes asíncronas.
  • Gestión de proxies y rotación de proxies mediante middleware personalizado o la biblioteca scrapy-rotating-proxies.

¿Qué es Pyspider?

Pyspider es un framework de rastreo web de código abierto escrito en Python. Está construido para extraer datos de sitios web con facilidad y flexibilidad, y le permite:

  • Defina cómo navegar y recopilar información de una o más páginas web a través de la CLI o de una interfaz web fácil de usar.
  • Gestiona aspectos como la programación de tareas, los reintentos y el almacenamiento de datos.
  • Limite los bloqueos mediante el rastreo distribuido y las tareas priorizadas.
  • Gestione flujos de trabajo y procesamientos de datos complejos con soporte integrado para bases de datos y colas de mensajes.

Scrapy vs Pyspider: Comparación de características para Web Scraping

Ahora que ha aprendido lo que son Scrapy y Pyspider, es hora de compararlos para el web scraping:

Característica Chatarra Pyspider
Caso práctico Proyectos de scraping complejos y a gran escala Tareas de raspado programadas
Gestión del raspado CLI CLI y UI
Métodos de análisis sintáctico XPath y selectores CSS Selectores CSS
Ahorro de datos Puede exportar datos a CSV y otros formatos de archivo Guarda automáticamente los datos en la base de datos
Reintentar Necesita intervención manual para reintentar Reintenta automáticamente las tareas fallidas
Programación de tareas Necesita integraciones externas Compatible de forma nativa
Rotación de proxy Admite la rotación de proxy mediante middlewares Requiere intervención manual
Comunidad Comunidad Hige, actualmente con más de 54k estrellas de GitHub, que contribuye activamente a ella Vasta comunidad, actualmente con más de 16k estrellas de GitHub, pero archivada desde el 11 de junio de 2024

La tabla comparativa Scrapy vs Pyspider muestra que estas dos librerías son similares. Las principales diferencias a alto nivel son:

  • Scrapy sólo se puede utilizar a través de la CLI, mientras que Pyspider también proporciona una interfaz de usuario.
  • Scrapy puede analizar selectores XPath y CSS, mientras que Pyspider sólo soporta selectores CSS.
  • Scrapy soporta automáticamente la rotación de proxy a través de la lógica de middleware personalizado.

Sin embargo, lo que es realmente importante tener en cuenta es que Pyspider ya no recibe soporte:

Repositorio GitHub archivado de Pyspider

Scrapy vs Pyspider: Comparación directa de scraping

Después de comparar Scrapy vs Pyspider, has aprendido que estos dos frameworks ofrecen características similares de web scraping. Por esa razón, la mejor manera de compararlos es a través de un ejemplo de codificación real.

Las dos secciones siguientes le mostrarán cómo utilizar Scrapy y Pyspider para raspar el mismo sitio. En concreto, la página de destino será la página “Hokey Teams” de Scrape This Site. Contiene datos de hockey en forma de tabla:

Los datos tabulares que se van a extraer

El objetivo de estas secciones es recuperar todos los datos de la tabla y guardarlos localmente. Veamos cómo.

Cómo utilizar Scrapy para Web Scraping

En este párrafo, aprenderás a utilizar Scrapy para recuperar todos los datos de la tabla proporcionada por el sitio web de destino.

Requisitos

Para seguir este tutorial, debes tener Python 3.7 o superior instalado en tu máquina.

Paso 1: Configuración del entorno e instalación de dependencias

Supongamos que llamas a la carpeta principal de tu proyecto hockey_scraper/. Al final de este paso, la carpeta tendrá la siguiente estructura:

hockey_scraper/
   └── venv/

Puede crear el directorio del entorno virtual venv/ de la siguiente manera:

python -m venv venv

Para activarlo, en Windows, ejecute

venv\Scripts\activate

De forma equivalente, en macOS/Linux, ejecute:

source venv/bin/activate

Ahora puede instalar Scrapy con:

pip install scrapy

Paso 2: Iniciar un nuevo proyecto

Ahora puedes lanzar un nuevo proyecto Scrapy. Dentro de la carpeta principal hockey_scraper/, escribe:

scrapy startproject hockey

Con ese comando, Scrapy creará una carpeta hockey/. Dentro de ella, generará automáticamente todos los archivos que necesites. Esta es la estructura de carpetas resultante:

hockey_scraper/ 
    ├── hockey/ # Main Scrapy project folder
    │   ├── __init__.py  
    │   ├── items.py # Defines the data structure for scraped items 
    │   ├── middlewares.py # Custom middlewares
    │   ├── pipelines.py # Handles post-processing of scraped data 
    │   ├── settings.py # Project settings 
    │   └── spiders/ # Folder for all spiders  
    ├── venv/ 
    └── scrapy.cfg # Scrapy configuration file

Paso nº 3: Generar la araña

Para generar una nueva araña que rastree el sitio web de destino, vaya primero a la carpeta hockey/:

cd hockey

A continuación, genere una nueva araña con:

scrapy genspider data https://www.scrapethissite.com/pages/forms/

En este script, data representa el nombre de la araña. Scrapy creará automáticamente un archivo data.py dentro de la carpeta spiders/. Ese archivo contendrá la lógica de raspado necesaria para recuperar los datos del equipo Hokey.

Paso 4: Definir la lógica de raspado

Ya está listo para codificar la lógica de raspado. En primer lugar, inspeccione la tabla que contiene los datos de interés en su navegador. Puedes ver que los datos están contenidos dentro de un elemento .table:

La clase de tabla en el HTML n el código HTML de la página web de destino

Para obtener todos los datos, escribe el siguiente código en el archivo data.py:

import scrapy

class DataSpider(scrapy.Spider):
    name = "data"
    allowed_domains = ["www.scrapethissite.com"]
    start_urls = ["https://www.scrapethissite.com/pages/forms/"]
    
    def parse(self, response):
        for row in response.css("table.table tr"):
            yield {
                "name": row.css("td.name::text").get(),
                "year": row.css("td.year::text").get(),
                "wins": row.css("td.wins::text").get(),
                "losses": row.css("td.losses::text").get(),
                "ot_losses": row.css("td.ot-losses::text").get(),
                "pct": row.css("td.pct::text").get(),
                "gf": row.css("td.gf::text").get(),
                "ga": row.css("td.ga::text").get(),
                "diff": row.css("td.diff::text").get(),
            }

Tenga en cuenta que las variables name, allowed_domains y start_urls han sido creadas automáticamente por Scrapy en el paso anterior.

Incluso el método parse() ha sido creado automáticamente por Scrapy. Por lo tanto, sólo tiene que añadir la lógica de raspado en este paso que está bajo el bucle for.

En detalle, el método response.css() busca la tabla. A continuación, el código itera sobre todas las filas de la tabla y obtiene los datos.

Paso 5: Ejecutar el rastreador y guardar los datos en un archivo CSV

Para ejecutar el rastreador y guardar los datos obtenidos en un archivo CSV, escriba lo siguiente:

scrapy crawl data -o output.csv

Con este código, Scrapy:

  • Ejecuta el archivo data.py que contiene la lógica de scraping
  • Guarda los datos raspados en un archivo CSV llamado output.csv

El archivo output.csv esperado producido por el scraper es:

El archivo CSV esperado

Tenga en cuenta que esta forma de usar Scrapy es la más corta, pero no es la única. Scrapy proporciona diferentes personalizaciones y configuraciones, y puedes aprender más sobre ello en nuestro artículo sobre Scrapy vs Requests.

Cómo utilizar Pyspider para el Web Scraping

Vea cómo utilizar Pyspider para raspar el mismo sitio web de destino.

Requisitos

Pyspider soporta Python3.6 como última versión. Si tienes instaladas versiones posteriores de Python, lee el siguiente paso para aprender a utilizar su versión 3.6.

Paso 1: Configuración del entorno e instalación de dependencias

Supongamos que llama a la carpeta principal de su proyecto hockey_scraper/.

Si tienes Python 3.7 o posterior, instala pyenv para obtener Python 3.6.

Utilice pyenv para instalar Python 3.6 con este comando:

pyenv install 3.6.15

Entonces haz que sea la versión local de Python, para no afectar a todo el sistema con una versión diferente:

pyenv local 3.6.15

Para asegurarte de que todo ha ido bien, verifica la versión de Python:

python --version

El resultado debe ser:

Python 3.6.15

Cree un entorno virtual seleccionando la versión correcta de Python:

python3.6 -m venv venv

Activa el entorno virtual como se indica en el capítulo anterior de esta guía. Ahora, puedes instalar Pyspider con:

pip install pyspider

Para iniciar la ejecución de la interfaz de usuario:

pyspider

Ten en cuenta que, como este repositorio está archivado y estás usando Python 3.6, recibirás algunos errores. Para solucionarlos, es posible que necesite instalar las siguientes bibliotecas:

pip install tornado==4.5.3 requests==2.25.1

Puede que también reciba otros errores relacionados con el fichero webdav.py. Busque el archivo y solucione lo siguiente:

  • En la clase ScriptProvider(), cambie el nombre del método getResourceInst() por get_resource_inst()
  • En la parte inferior del archivo, busque la variable config = DEFAULT_CONFIG.copy() y cambie todo el código subsiguiente por:
config = DEFAULT_CONFIG.copy()
config.update({
    "mount_path": "/dav",
    "provider_mapping": {
        "/": ScriptProvider(app)
    },
    "domaincontroller": NeedAuthController(app),
    "verbose": 1 if app.debug else 0,
    "dir_browser": {"davmount": False,
                    "enable": True,
                    "msmount": False,
                    "response_trailer": ""},
})
dav_app = WsgiDAVApp(config)

La interfaz web de pyspider debería poder iniciarse ahora. Visite http://localhost:5000/ en su navegador, y esto es lo que debería ver:

La interfaz de usuario de Pyspider

Paso 2: Crear un nuevo proyecto

Haga clic en “Crear” para crear un nuevo proyecto y rellene los campos:

  • Elija un nombre de proyecto de su elección, por ejemplo Hockey_scraper.
  • Establezca https://www.scrapethissite.com/pages/forms/ en el campo URL(s) de inicio.

Este debería ser el resultado:

Resultado de la creación del proyecto en Pyspider

Paso 3: Definir la lógica de raspado

Implementar la lógica de raspado escribiendo el código Python directamente en el editor en la parte derecha de la interfaz de usuario:

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {}

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl("https://www.scrapethissite.com/pages/forms/", callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc("table.table tr").items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "name": row.css("td.name::text").get(),
            "year": row.css("td.year::text").get(),
            "wins": row.css("td.wins::text").get(),
            "losses": row.css("td.losses::text").get(),
            "ot_losses": row.css("td.ot-losses::text").get(),
            "pct": row.css("td.pct::text").get(),
            "gf": row.css("td.gf::text").get(),
            "ga": row.css("td.ga::text").get(),
            "diff": row.css("td.diff::text").get(),
        }

Esto es lo que ha cambiado respecto al código por defecto:

  • El método response.doc() busca la tabla de destino.
  • detail_page() devuelve las filas interceptadas mediante el método row.css().

Haz clic en “Guardar” y “Ejecutar” para iniciar el proceso de scraping. Los datos resultantes serán similares a los obtenidos con Scrapy.

¡Genial! Ahora ya sabes cómo utilizar Scrapy y Pyspider para el web scraping.

Scrapy vs Pyspider: ¿Cuál usar?

La comparación entre Scrapy y Pyspider ha mostrado cómo utilizarlos, pero ¿cuál es mejor? ¡Es hora de averiguarlo!

Elige Scrapy:

  • Para proyectos de alto rendimiento que necesiten rastreo paralelo y funciones avanzadas, como el estrangulamiento.
  • Si necesita integrar su scraping con pipelines externos u otras herramientas.
  • Si se siente seguro utilizando CLI y con escenarios de web scraping y prefiere un framework actualizado.

Elija Pyspider si:

  • Prefiere utilizar una interfaz de usuario en lugar de la CLI.
  • Desea trabajar en un sistema distribuido y prefiere configuraciones sencillas.
  • Desea programar tareas de raspado.

Como siempre, no hay un ganador definitivo: la mejor herramienta de scraping depende totalmente de sus necesidades específicas y de su caso de uso.

Limitaciones de Scrapy y Pyspider

Scrapy y Pyspider son potentes frameworks para el web scraping, pero tienen sus limitaciones.

En primer lugar, tienen dificultades para raspar sitios de contenido dinámico que utilizan JavaScript para la representación o la recuperación de datos. Aunque ambos pueden ampliarse para rastrear sitios con JavaScript, están intrínsecamente limitados en ese aspecto. Esto también los hace más susceptibles a las medidas anti-scraping habituales.

Además, ambos frameworks están sujetos a bloqueos de IP, ya que realizan muchas peticiones automáticas. Éstas pueden activar limitadores de velocidad, lo que lleva a que tu IP entre en la lista negra. Una solución para evitar que tu IP sea baneada es integrar proxies en tu código.

Para la rotación de proxies, vea nuestra guía sobre cómo usar proxies para rotar direcciones IP en Python.

Por último, si busca servidores proxy fiables, tenga en cuenta que la red proxy de Bright Data cuenta con la confianza de empresas de la lista Fortune 500 y más de 20.000 clientes en todo el mundo. Esta extensa red incluye:

Conclusión

En esta entrada del blog Scrapy vs Pyspider, aprendiste sobre el papel de las dos bibliotecas en el web scraping. Exploraste sus características para la extracción de datos y comparaste su rendimiento en un escenario real de paginación.

Pyspider proporciona una interfaz de usuario amigable aunque, desafortunadamente, está obsoleta. Scrapy, en cambio, es útil para grandes proyectos, ya que proporciona la mayoría de las herramientas necesarias para el scraping estructurado y su tecnología subyacente está actualizada con las últimas versiones de Python.

También ha descubierto sus limitaciones, como las posibles prohibiciones de IP. Afortunadamente, estos retos pueden superarse utilizando proxies o soluciones dedicadas de raspado web como la API Web Scraper de Bright Data. Esta API centrada en el raspado se integra perfectamente con Scrapy, Pyspider y cualquier otro cliente HTTP o herramienta de raspado web, lo que permite la extracción de datos sin restricciones.

Cree hoy mismo una cuenta gratuita en Bright Data para explorar nuestras API de proxy y scraper.

No se requiere tarjeta de crédito