Como scrapear con Scrapy

Pues nada va siendo el momento de hablar de que es exactamente scrapy, la parte más simplificada sería decir que es una librería donde podemos crear un crawler o rastreador o bien un scrapper o raspador como han dicho últimamente.

Lo cierto es que es uno de los scrapers más completos que he visto ahora mismo, pero también es de los que más lío te pueden dar y quizás no te interese en todo momento utilizar este tipo de raspadores.

Este scrapeador está creado en Python algo que ayuda mucho a nuestra manera de programar que es en también como no puede ser en Python.

¿Cómo instalo Scrapy?

La instalación lo hice de una manera bastante fácil y cómoda, nada más y nada menos que utilizando el código en el cmd o shell del ordenador sin más misterio que ese.

pip install Scrapy

También tienes la opción de usar conda install -c conda-forge scrapy si utilizas Conda,  (yo lo uso como sabéis para temas de machine learning) del cual siempre se puede hablar si queréis u os interesa.

Es importante que entréis en la web donde tienes toda la información de scrapy aunque en inglés para que veas posibles documentaciones que te puedan hacer falta para más adelante.

En estos casos que serán ejemplos no nos hacen falta tener un hosting o algo en la nube ded¡cado ya que son proyectos pequeños pero si vas a dedicarte a esto de manera más profesional o con un conjunto de información a scrapear muy alto sería muy recomendable.

  • lxml eficiente parseador XML y HTML
  • parsel extractor de HTML y XML de la librería lxml
  • w3lib para varias cosas nos vale esto, podemos mejorar URL y codificadores de páginas web
  • twisted marco de asíncrono
  • cryptography y pyOpenSSL, nuestro gran aliado para las necesidades de seguridad a nivel de red

Como usar scrapy con Python

Voy a ir explicandotelo respecto al video que tenemos ya grabado y poco a poco, así no te empachas de información y así también te da tiempo a poder asimilar bien todos los datos.

Como puedes ver en el video hemos hecho los siguientes pasos:

Crear proyecto

El primer paso de todos es crear el proyecto, algo que si no lo hacemos difícilmente podemos trabajar en él.

Para ello lo que he hecho ha sido crear una carpeta que la he llamado «scrapy» y dentro de ella dentro de Visual Studio Code he escrito lo siguiente en el shall.

scrapy startproject tutorial

Una vez escrito esto vamos a ver como se nos han creado diferentes carpetas, entre ellas la dos de tutorial, spider…

Este es el ejemplo de lo que nos ha creado dentro de la dentro de la carpeta y una vez dentro de scarpy, dentro de tutorial.

Como todo esto se ha creado solo poniendo el código que hemos mencionado anteriormente.

como vereis hay varios archivos dentro de scrapy, y ahora mismo no estamos usando ninguno si no que encima luego crearemos otro acabando en .py (para quien no lo sepa es la terminación de los scripts creado en python, hay otros más pero ahora mismo solo nos interesa hablar de este), más adelante hablaremos y utilizaremos los diferentes archivos que tenemos para ver como utilizar una base de datos y demás con nuestro scrapy.

Crear nuestra primera araña

Ahora nos metemos a programar y para ello hay que tener unas pequeñas nociones de ello, pero aún así voy a intentar explicar de una manera más sencilla y con palabras mundanas todo lo que tenemos:

import scrapy
 
class QuoteSpider(scrapy.Spider):
    name = ‘quotes’
    start_urls = [
                            ‘http://quotes.toscrape.com/’,
                          ]
    def parse(self, response):
         title = response.css(‘title’)extract()
         yield {‘titletext’:title}

Empezaremos con la parte que está en naranja:

Es la llamada a la librería, con ella importamos todas la funciones que tenemos de scrapy en este caso.

La parte verde:

Aquí es la parte donde definimos nuestra araña, que es quotes y damos la información de donde queremos coger la información, en este caso solo hemos puesto una url, pero podemos poner todos los que queramos agregando más urls debajo de la que tenemos escrita pero acabando siempre con una coma.

(En el video no lo he hecho MAL POR MI, porque aunque no hace falta, la manera correcta es siempre que acabe en coma para poder ampliar).

Parseado en azul:

Es la parte que utilizamos para manejar la respuesta que nos entrega la araña en cada solicitud de las que hagamos.

Dentro de ese parse tenemos un response que es el que contiene el contenido de la web scrapeada y también tiene ciertos métodos que nos pueden ser de utilidad.

Esto muy simplificado es lo que hacemos y las partes que necesitamos

Ejecutar nuestra araña (crawl)

Arrancamos el programa:

para esto tenemos que hacer el crawleo de la URL que nos interesa y es exactamente la que hemos escrito antes.

El código que tenemos que escribir es este.

scrapy crawl quotes
 
No creo que haga falta explicarlo mucho pero bueno que no quede como que no hay interés.
Con scrapy estamos haciendo un llamamiento, crawl es la acción que queremos realizar y quotes es de que queremos realizar la  acción, recordad (o mirar arriba en el script) que lo hemos llamado quotes a la araña.

Primera araña con scrapy

En este caso como podemos ver como sacamos el título y dependiendo como lo escribas sacas con el código html o solo el texto.

Más adelante aunque lo ampliaré aquí veremos como sacar más información de la web como son los textos, etiquetas… pero irá más adelante en próximos videos y ahí es donde podréis seguir este hilo.

Como sacar la información con CSS

Bueno llegamos a la part de que ya hemos crawleado nuestra web, pero queremos ver esa información, (más adelante sabremos como sacarlo a archivos externos de nuestra shell o terminal en este caso de Visual Studio).

Pues una vez metidos en la terminal en nuestro caso tenemos que escribir el siguiente comando:

scrapy shell "http://quotes.toscrape.com"

Una vez escrito esperamos a que se temine de crawlear nuevamente la web se nos abra scrapy par poder sacar la información desde aquí.

dentro de la shell de scrapy y en nuestro caso al tener instalado conda en el PC (cambia un poco la vista pero las acciones son iguales) tenemos que escribir los códigos que nos sacarán los datos que buscamos.

response.css("title")

Este primer paso nos enseña de manera muy bruta la información que sale de este código que es muy «bruto» nos da toda la información como el texto que tenemos en el título en este caso.

 

response.css(«title»)
[<Selector xpath=’descendant -or-self::title’ data='<title>Quotes to Scrape</title>’>]

Vemos aquí las características del título como que es un dato de título y que está dentro de las etiquetas de title del html.

Pero claro no es algo que te diga mucho o mejor dicho, esta información es tan completa ahora mismo que hasta estorba, ya que a ti te interesa sacar el título.

Pues bien ahora introducimos el siguiente código para ello:

response.css(«title»).extract()

[‘<title>Quotes to Scrape</title>’]

Ya vamos teniendo nuestro contenido más filtrado, ahora al menos vemos que nuestro título consta de Quotes to Scrape y que es lo que está encerrado entra las etiquetas de título (si, es cierto que antes también, pero me dirás que ahora no se ve más claro).

Pero nosotros queremos aún más clara la informació, es decir, que nos diga que contiene las etíquetas de título y nos deje de lios con el html y demás, pues es fácil.

response.css(«title::text»).extract()

[‘Quotes to Scrape]

Lo conseguimos, tenemos la información que necesitamos, pero tu duda, que me imagino cual es y si no pues será la duda de otr@, es… «¿Y si tengo dos títulos y quiero que me salga uno de ellos?». Pues ahora mismo te escribo el código, en nuestro ejemplo sale el mismo porque solo tenemos uno, pero si hubiera más sería de la siguiente manera.

response.css(«title::text»)[0].extract()

[‘Quotes to Scrape]

Como sabemos las listas empiezan desde el 0 (cero) con esto quiere decir que el cero sería le primer título que tenga nuestro código (web) y el 1, uno, el segundo.

Esto también se puede hacer con el siguiente código:

response.css(«title::text»).extract_first()

[‘Quotes to Scrape]

Y como hemos podido comprobar saca la misma información

Sacar información con Xpath

Bien ahora es el momento de sacar la información no tanto con el css que está muy bien pero hay quienes les interesa más hacerlo con Xpath, hay gente para todo y aquí somos inclusivos, xpath-friendly.

Bueno vamos a ir al grano que me lío, en el ejemplo que tenemos con la web de quotes vemos que todo es prácticamente igual como el response.xpath(‘aún es ejemplo no hagas caso a esto’).get().

Ya ves que no tiene nada del otro mundo y que es bastante fácil ahora bien cambia las partes más internas como es para sacar la misma palabra:

>>response.xpath(‘//span/text()’).get()

>>response.css(‘span::text’).get()

Estos dos códigos nos dará lo mismo ‘good’, solo que de una manera lo sacamos como hemos dicho en xpath y otro en css

Mi conclusión

Scrapy es una librería muy potente y aunque está claro que no es la más fácil de usar es de lo más completo.

Más adelante veremos otras librerías donde usaremos solo unas pequeñas partes de lo que estamos usando aquí como el response por ejemplo y se nos hará más fácil incluso de entender y de usar.

Es por cosas como esta que a veces es casi mejor empezar por lo de dificultad más alta para luego empezar a atacar las variantes que tenemos.

Scrapy ya vereis todo lo que se puede hacer  y que nivel puedes llegar a considerar scrapear, vamos, que si te lo curras sacas tu mini-screaping frog o incluso algo más potente.

Si queréis dejar un mensaje y seguimos hablando por aquí opiniones y lo que haga falta

Deja un comentario

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