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.
Scrapy: el framework estrella
Qué aprenderás sobre el framework Scrapy
El framework asíncrono: Scrapy
Instalación de Scrapy en Mac OS
Instalación de Scrapy en Linux
Instalación de Scrapy en Windows
Nuestro primer Hello World
Recordando generadores e iteradores
Trabajando con Scrapy
Scrapy Shell
Nuestro primer proyecto: estructura de carpetas
Spiders
Usando XPath para extraer datos
Guardando los datos
Seguir links: response.follow
Múltiples callbacks
Pasando argumentos a nuestro spider
Configuraciones útiles
Proyecto: Platzi Intelligence Agency
Platzi Intelligence Agency
Inicializando el repositorio local
Utilizando XPath en el sitio de la CIA
Spider: CIA
Finalizando la creación del spider
Creando el frontend de nuestra aplicación
Deploy a GitHub Pages
Deploy en Scrapy Cloud
Bonus: automatizar procesos con la API
Conclusiones
Evitar meterse en problemas
El siguiente paso en tu camino
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 15
Preguntas 7
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í.
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
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
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
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
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.