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:
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:
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
:
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:
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étodogetResourceInst()
porget_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:
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:
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étodorow.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:
- Proxies de centros de datos: Más de 770.000 IP de centros de datos.
- Proxies residenciales: Más de 72 millones de IP residenciales en más de 195 países.
- Proxies ISP: Más de 700.000 IP de ISP.
- Proxies móviles: Más de 7 millones de IP móviles.
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