No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

0D
15H
29M
19S
Curso de Scrapy

Curso de Scrapy

Facundo García Martoni

Facundo García Martoni

Guardando los datos

12/27
Recursos

Aportes 15

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Si cuando guardan el archivo no les aparece el archivo de una forma mas legible, tienen que entrar a settings y buscar “format on save” lo seleccionan.

En una sola linea borrar y crear el archivo nuevamente:

rm quotes.json && scrapy crawl quotes -o quotes.json

Y el Código de Python:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com'
    ]

    def parse(self, response):
        title = response.xpath('//h1/a/text()').get()
        quotes = response.xpath('//span[@class="text" and @itemprop="text"]/text()').getall()
        top_quotes = response.xpath('//div[contains(@class, "tags-box")]//span[@class="tag-item"]/a/text()').getall()

        yield {
            "title": title, 
            "quotes": quotes, 
            "top_quotes": top_quotes
        }

Otra solución para conservar sólo el resultado nuevo es usar el flag -O en lugar de -o, es decir, ejecutar

(venv) scrapy crawl quotes -O quotes.json

Más detalles en la documentación oficial aquí.

Exportar los datos

Para guardar los datos ya sea en formato csv, json u otro debo convertir al metodo parse en un generador haciendolo de la siguiente manera:

def parse(self, response):
        
        title = response.xpath('//h1/a/text()').get()
       
        quotes = response.xpath('//span[@class="text" and @itemprop="text"]/text()').getall()
        
        top_ten_tags = response.xpath('//span[@class="tag-item"]/a/text()').getall()

        yield {
            'title': title,
            'quotes': quotes,
            'top_ten_tags': top_ten_tags
        }

Y en consola escribiremos:

scrapy crawl quotes -o quotes.json # -o es de output y el archivo se guardara
# en la raiz de nuestro proyecto.
# Para que los archivos se guarden en otro formato solo debo cambiar la extension
# ejemplo scrapy crawl quotes -o quotes.csv
<h3>Importante</h3>

Si vuelvo a ejecutar el comando anterior ya existiendo ese archivo lo que realizara scrapy es un append al archivo existente, para solucionar este problema y no tener datos duplicados unicamente debo borrar el archivo antes de ejecutar el comando.

Encontré un custom_settings que me permite poner por defecto en donde queremos almacenar los datos:

custom_settings = {
		'FEEDS' : {
			'data.json' : { #edit: uri needs to be absolute path
				'format' : 'json',
				'store_empty' : True,
				'indent': 4,
			}
		},
		'FEED_EXPORT_ENCODING' : 'utf-8',		
	}

Podemos agregar múltiples direcciones y tipos de archivos para guardar la información, lo puse justo debajo de start_urls.

Para hacer el JSON legible en VSC yo utilice Ctrl+Shift+I en Lubuntu y me funcionó.

Si alguno está usando pycharm, para darle el formato legible al json solo tienen que seleccionar todo el texto y presionar ctrl+alt+L

la unica diferencia que veo entre scrapy y hacerlo uno mismo, es que aca ya esta segmentados los archivos, pero siempre tocara hacer uno su codigo a puño y letra aqui les dejo el scrapper que hice para pbtener el dataset de los bloques minados de bitcoin
Kaggle
GitHub

para esta fecha ya podemos sobre escribir de manera automatica con -O, es decir en vez de una “o” minuscula se coloca una “O” mayuscula y sobre escribe!!

También se puede elegir donde guardar el archivo. por ej

  • Vuelve una carpeta, entra a la carpeta resultados y ahí guarda el archivo .json
scrapy crawl quotes -o "../resultados/quotes.json"

Facundo el mejor! 💪

Recomiendo:

def parse(self, response):
        
        title = response.xpath('//h1/a/text()').get()
       
        quotes = response.xpath('//span[@class="text" and @itemprop="text"]/text()').getall()
        
        top_ten_tags = response.xpath('//span[@class="tag-item"]/a/text()').getall()

        yield {
            'title': title,
            'quotes': quotes,
            'top_ten_tags': top_ten_tags
        }

Para evitar que nos haga el append podríamos en vez de usar -o usar el -O.
De este modo, entendera que lo que queremos es reemplazar el archivo por lo nuevo que extraiga.

Que buena clase

<h4>Exportar los datos</h4>

Para guardar los datos ya sea en formato csv, json u otro debo convertir al metodo parse en un generador haciendolo de la siguiente manera:

def parse(self, response):
        
    title = response.xpath('//h1/a/text()').get()
    quotes = response.xpath('//span[@class="text" and @itemprop="text"]/text()').getall()
    top_ten_tags = response.xpath('//span[@class="tag-item"]/a/text()').getall()

    yield {
        'title': title,
        'quotes': quotes,
        'top_ten_tags': top_ten_tags
    }

Y en consola escribiremos:

  • Para archivos json
scrapy crawl quotes -o quotes.json # -o es de output y el archivo se guardara
# en la raiz de nuestro proyecto.
# Para que los archivos se guarden en otro formato solo debo cambiar la extension
# ejemplo scrapy crawl quotes -o quotes.csv
  • Para csv
scrapy crawl quotes -o quotes.csv

Si vuelvo a ejecutar el comando anterior ya existiendo ese archivo lo que realizara scrapy es un append al archivo existente, para solucionar este problema y no tener datos duplicados unicamente debo borrar el archivo antes de ejecutar el comando.

Para solucionarlo, podemos ejecutar el siguiente comando

rm quotes.json && scrapy crawl quotes -o quotes.json