Introducción al Framework Scrapy para Web Scraping

Qué es Scrapy

Scrapy es un framework completamente implementado en Python diseñado para rastrear sitios web y extraer datos estructurados. Tiene una amplia gama de aplicaciones.

La potencia del framework permite a los usuarios desarrollar únicamente unos pocos módulos para implementar fácilmente un rastreador que capture contenido web e imágenes, resultando extremadamente conveniente.

Scrapy utiliza el framework de red asíncrono Twisted para gestionar las comunicaciones de red, lo que acelera la descarga sin necesidad de implementar un framework asíncrono propio. Además, incluye diversas interfaces de middleware que permiten cumplir requisitos diversos de manera flexible.

Arquitectura de Scrapy

Scrapy Engine (Motor): Gestiona todo el flujo de datos del sistema y dispara las transacciones (núcleo del framework).

Scheduler (Planificador): Recibe las solicitudes enviadas por el motor, las introduce en una cola y las devuelve cuando el motor las solicita nuevamente. Puede considerarse como una cola de prioridad de URLs que determina qué URL rastrear a continuación, eliminando simultáneamente las URLs duplicadas.

Downloader (Descargador): Responsible de descargar todas las solicitudes Requests enviadas por el Motor de Scrapy, y devuelve las Responses obtenidas al Motor, que a su vez las entrega al Spider para su procesamiento.

Spider (Rastreador): Es el componente principal que extrae la información necesaria de páginas web específicas, es decir, las entidades (Items). También puede extraer enlaces para que Scrapy continúe rastreador la siguiente página.

Item Pipeline (Tubería de Elementos): Gestiona las entidades extraídas por el rastreador. Sus funciones principales incluyen la persistencia de datos, validación de entidades y eliminación de información innecesaria. Cuando una página es analizada por el rastreador, se envía al pipeline donde los datos pasan por varios pasos específicos de procesamiento.

Downloader Middlewares (Middlewares de Descarga): Situados entre el motor de Scrapy y el descargador, procesan principalmente las solicitudes y respuestas entre ambos.

Spider Middlewares (Middlewares del Rastreador): Intermedian entre el motor de Scrapy y el planificador, gestionando las solicitudes y respuestas enviadas desde el motor hacia el planificador.

Flujo de Ejecución de Scrapy

  1. Primero, el motor obtiene un enlace (URL) del planificador para el siguiente rastreo.
  2. El motor encapsula la URL en una solicitud (Request) y la envía al descargador, que descarga el recurso y lo encapsula en una respuesta (Response).
  3. A continuación, el rastreador analiza la Response.
  4. Si se extraee una entidad (Item), se envía al pipeline de entidades para su procesamiento adicional.
  5. Si se extrae un enlace (URL), se envía al Planificador para esperar el rastreo.

Instalación

Instalación en Linux:

pip3 install scrapy

Instalación en Windows:

# 1. pip3 install wheel

# 2. Descargar twisted desde http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

# 3. En el directorio de descarga, ejecutar pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

# 4. pip3 install pywin32

# 5. pip3 install scrapy

Herramientas de Línea de Comandos

# 1 Ver ayuda
    scrapy -h
    scrapy <command> -h

# 2 Existen dos tipos de comandos: Project-only debe ejecutarse desde la carpeta del proyecto, mientras que los comandos Global no requieren esto.
    Comandos Globales:
        startproject # Crear proyecto
        genspider    # Crear programa rastreador
        settings     # Si está en el directorio del proyecto, obtiene la configuración de ese proyecto
        runspider    # Ejecutar un archivo python independiente, sin necesidad de crear un proyecto
        shell        # scrapy shell url - Depuración interactiva, para verificar si las reglas del selector son correctas
        fetch        # Rastrear una página independientemente, puede obtener headers de solicitud
        view         # Abrir directamente el navegador después de descargar, para identificar datos de solicitudes ajax
        version      # scrapy version - Ver versión de scrapy, scrapy version -v ver versiones de las dependencias

    Comandos de Proyecto:
        crawl        # Ejecutar rastreador, debe crear un proyecto primero, asegurar que ROBOTSTXT_OBEY = False en configuración
        check        # Verificar errores de sintaxis en el proyecto
        list         # Listar los nombres de rastreadores en el proyecto
        edit         # Editor, generalmente no se usa
        parse        # scrapy parse url --callback funcion_retorno - Verificar si la función de retorno es correcta
        bench        # scrapy bench - Prueba de estrés

Estructura del Proyecto

nombre_proyecto/
   scrapy.cfg  # Configuración principal del proyecto, utilizada para desplegar scrapy; la configuración relacionada con rastreadores está en settings.py
   nombre_proyecto/
       __init__.py
       items.py  # Plantilla de almacenamiento de datos para estructurar datos, similar al Model de Django
       pipelines.py  # Archivo de pipeline del proyecto, como persistencia de datos estructurados
       settings.py  # Archivo de configuración, como niveles de recursividad, concurrencia, descargas diferidas, etc.
       spiders/  # Directorio de rastreadores, donde se crean archivos y se escriben reglas de rastreo
           __init__.py
           rastreador1.py
           rastreador2.py
           rastreador3.py

Notas:

  1. Generalmente, al crear archivos de rastreador, se nombran usando el dominio del sitio web.
  2. Por defecto, los comandos solo pueden ejecutarse en terminal. Para operar más cómodamente:

Si desea ejecutar en PyCharm:

# En el directorio del proyecto, crear: entrypoint.py
from scrapy.cmdline import execute
# execute(['scrapy', 'crawl', 'amazon','--nolog'])  # Sin impresión de logs
# execute(['scrapy', 'crawl', 'amazon'])

# Si necesita pasar argumentos al programa de rastreo desde la línea de comandos:
# scrapy crawl amazon -a keyword=iphone8
execute(['scrapy', 'crawl', 'amazon1','-a','keyword=iphone8','--nolog'])  # Sin impresión de logs

Proyecto Práctico

1. Crear aplicación de rastreo

scrapy startproject Chistes  # Crear proyecto

cd Chistes # Entrar al directorio del proyecto

scrapy genspider chistes www.chistes.com  # Nombre de la aplicación URL inicial de rastreo

2.编写爬虫文件:Una vez ejecutado el paso 2, se generará un archivo py de rastreador en la carpeta spiders del proyecto:

import scrapy
 
class ChistesSpider(scrapy.Spider):
    name = 'chistes'  # Nombre de la aplicación
    # Dominios permitidos (si encuentra URL de otros dominios, no podrá rastrear datos)
    allowed_domains = ['https://www.chistes.com/']
    start_urls = ['https://www.chistes.com/']  # URL inicial de rastreo
 
    def parse(self, response):
        # xpath es un método de response que puede aplicar expresiones xpath directamente
        contenedor_principal = response.xpath('//div[@id="contenido-principal"]/div')
        datos_extraidos = [] # Para almacenar los datos analizados
        for elemento in contenedor_principal:
            # Las funciones xpath devuelven una lista con datos de tipo Selector. El contenido analizado está encapsulado en el objeto Selector, se necesita llamar a extract() para obtener el contenido.
            autor = elemento.xpath('.//div[@class="autor"]/a/h2/text()')[0].extract()
            texto = elemento.xpath('.//div[@class="texto"]/span/text()')[0].extract()
 
            # Encapsular el contenido analizado en un diccionario
            diccionario = {
                'autor': autor,
                'contenido': texto
            }
            # Almacenar datos en la lista
            datos_extraidos.append(diccionario)
 
        return datos_extraidos

3. Configurar settings.py:

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' # Suplantar identidad del agente de solicitud
 
ROBOTSTXT_OBEY = False  # Puede ignorar o no cumplir el protocolo robots

4. Ejecutar el programa de rastreo:

scrapy crawl nombre_rastreador  # Esta forma de ejecución mostrará información de logs
scrapy crawl nombre_rastreador --nolog  # Esta forma de ejecución no mostrará información de logs

Recursos Adicionales ==================== Sitio oficial de Scrapy: http://doc.scrapy.org/en/latest

Etiquetas: Python scrapy web-scraping framework twisted

Publicado el 10-6 05:05