Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Scrapy

Curso de Scrapy

Facundo García Martoni

Facundo García Martoni

Guardando los datos

12/27
Recursos

Aportes 14

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta 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
        }

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.

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í.

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

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

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

Facundo el mejor! 💪

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.

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"

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