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 鈥渇ormat 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 鈥渙鈥 minuscula se coloca una 鈥淥鈥 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