Implementando Web Scraping en Python con Scrapy

Hoy en día, los datos lo son todo y si alguien quiere obtener datos de páginas web, hay una forma de usar una API o implementar técnicas de Web Scraping. En Python, el web scraping se puede hacer fácilmente usando herramientas de scraping como BeautifulSoup. Pero, ¿qué sucede si el usuario está preocupado por el rendimiento del raspador o necesita raspar los datos de manera eficiente?

Para superar este problema, se puede utilizar el módulo MultiThreading/Multiprocessing with BeautifulSoup y se puede crear una araña, que puede ayudar a rastrear un sitio web y extraer datos. Para ahorrar tiempo, use Scrapy.

With the help of Scrapy one can :

1. Fetch millions of data efficiently
2. Run it on server
3. Fetching data 
4. Run spider in multiple processes

Scrapy viene con características completamente nuevas para crear arañas, ejecutarlas y luego guardar datos fácilmente raspándolas. Al principio parece bastante confuso, pero es lo mejor.

Hablemos de la instalación, creando una araña y luego probándola.

Paso 1: Crear un entorno virtual

Es bueno crear un entorno virtual ya que aísla el programa y no afecta a ningún otro programa presente en la máquina. Para crear un entorno virtual, primero instálelo usando:

sudo apt-get install python3-venv

Cree una carpeta y luego actívela:

mkdir scrapy-project && cd scrapy-project
python3 -m venv myvenv 

Si el comando anterior da un error, intente esto:

python3.5 -m venv myvenv

Después de crear un entorno virtual, actívelo usando:

source myvenv/bin/activate

 
Paso 2: Instalación del módulo Scrapy

Instale Scrapy usando:

pip install scrapy

Para instalar scrapy para cualquier versión específica de python:

python3.5 -m pip install scrapy

Reemplace la versión 3.5 con alguna otra versión como 3.6.
 
Paso 3: Creación del proyecto Scrapy

Mientras trabaja con Scrapy, uno necesita crear un proyecto scrapy.

scrapy startproject gfg

En Scrapy, siempre intente crear una araña que ayude a obtener datos, así que para crear una, muévase a la carpeta de araña y cree un archivo python allí. Cree una araña con el nombre de gfgfetch.pyarchivo python.
 
Paso 4: Creando Spider

Mover a la carpeta araña y crear gfgfetch.py. Mientras crea spider, siempre cree una clase con un nombre único y defina los requisitos. Lo primero es nombrar la araña asignándole una variable de nombre y luego proporcionar la URL de inicio a través de la cual la araña comenzará a rastrearse. Defina algunos métodos que ayuden a rastrear mucho más profundamente en ese sitio web. Por ahora, desechemos todas las URL presentes y almacenemos todas esas URL.

import scrapy
  
class ExtractUrls(scrapy.Spider):
      
    # This name must be unique always
    name = "extract"                 
  
    # Function which will be invoked
    def start_requests(self):
          
        # enter the URL here
        urls = ['https://www.geeksforgeeks.org/', ]
          
        for url in urls:
            yield scrapy.Request(url = url, callback = self.parse)

El motivo principal es obtener cada URL y luego solicitarla. Obtenga todas las URL o etiquetas de anclaje de él. Para hacer esto, necesitamos crear un método más parse para obtener datos de la URL dada.
 
Paso 5: Obtención de datos de una página determinada
Antes de escribir la función de análisis, pruebe algunas cosas, como cómo obtener datos de una página determinada. Para hacer esto, haga uso de scrapy shell. Es como el intérprete de python pero con la capacidad de extraer datos de la URL dada. En resumen, es un intérprete de Python con funcionalidad Scrapy.

scrapy shell URL

Nota: asegúrese de estar en el mismo directorio donde está presente scrapy.cfg, de lo contrario no funcionará.

scrapy shell https://www.geeksforgeeks.org/

Ahora, para obtener datos de la página dada, use selectores . Estos selectores pueden ser de CSS o de Xpath. Por ahora, intentemos obtener todas las URL mediante el Selector de CSS.

  • Para obtener la etiqueta de anclaje:
    response.css('a')
  • Para extraer los datos:
    links = response.css('a').extract()
  • Por ejemplo, los enlaces[0] mostrarán algo como esto:
    '<a href="https://www.geeksforgeeks.org/" title="GeeksforGeeks" rel="home">GeeksforGeeks</a>'
  • Para obtener el href atributo, use attributes la etiqueta.
    links = response.css('a::attr(href)').extract()

Esto obtendrá todos los datos href que son muy útiles. Haz uso de este enlace y empieza a solicitarlo.

Ahora, creemos un método de análisis y busquemos todas las direcciones URL y luego lo entregamos. Siga esa URL en particular y obtenga más enlaces de esa página y esto seguirá sucediendo una y otra vez. En resumen, estamos obteniendo todas las URL presentes en esa página.

Scrapy, por defecto, filtra aquellas url que ya han sido visitadas. Por lo tanto, no volverá a rastrear la misma ruta de URL. Pero es posible que en dos páginas diferentes haya dos o más de dos enlaces similares. Por ejemplo, en cada página, el enlace del encabezado estará disponible, lo que significa que este enlace del encabezado aparecerá en cada solicitud de página. Así que trate de excluirlo marcándolo.

# Parse function
def parse(self, response):
      
    # Extra feature to get title
    title = response.css('title::text').extract_first() 
      
    # Get anchor tags
    links = response.css('a::attr(href)').extract()     
      
    for link in links:
        yield 
        {
            'title': title,
            'links': link
        }
          
        if 'geeksforgeeks' in link:         
            yield scrapy.Request(url = link, callback = self.parse)

 
A continuación se muestra la implementación de scraper:

# importing the scrapy module
import scrapy
  
class ExtractUrls(scrapy.Spider):
    name = "extract"
  
    # request function
    def start_requests(self):
        urls = [ 'https://www.geeksforgeeks.org', ]
          
        for url in urls:
            yield scrapy.Request(url = url, callback = self.parse)
  
    # Parse function
    def parse(self, response):
          
        # Extra feature to get title
        title = response.css('title::text').extract_first() 
          
        # Get anchor tags
        links = response.css('a::attr(href)').extract()     
          
        for link in links:
            yield 
            {
                'title': title,
                'links': link
            }
              
            if 'geeksforgeeks' in link:         
                yield scrapy.Request(url = link, callback = self.parse)

 
Paso 6: en el último paso, ejecute la araña y obtenga la salida en un archivo json simple

scrapy crawl NAME_OF_SPIDER -o links.json

Aquí, el nombre de la araña es «extraer» por ejemplo. Obtendrá un montón de datos en unos pocos segundos.

Producción :

Nota: raspar cualquier página web no es una actividad legal. No realice ninguna operación de raspado sin permiso.

Referencia: https://doc.scrapy.org/en/ .

Publicación traducida automáticamente

Artículo escrito por shashank-sharma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *