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

Seguir links: response.follow

13/27
Recursos

Aportes 15

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Si alguien busca una herramienta con la cual puedan dar “clicks” de forma automática o ingresar labels para enviar formularios, puede investigar la herramienta SELENIUM de Python.
Es muy útil para extraer datos de esta manera. Tiene algunas cuantas limitaciones como la resolución de Captchas, por ejemplo.

el uso de FEED_URI y FEED_FORMAT está deprecado desde la version 2.1 … Ahora se pueden usar múltiples formatos. Ver documentacion:

Para exportar a json lo configuré así:

custom_settings = {
        'FEEDS': {
            'quotes.json': {
                'format': 'json',
                'encoding': 'utf8',
                'store_empty': False,
                'fields': None,
                'indent': 4,
                'item_export_kwargs': {
                    'export_empty_fields': True,
                },
            },
        },
    }

Resumen:
■■■■■■■

Nuestro [[Spiders|spider]] puede considerar la posibilidad de scrapear varias páginas del sito, buscando el “botón” que hace que pases la pagina, y extrayendo el atributo href para luego usar la función del objeto response.follow(next_url, callback = self.name_function). Con esta función implementada puedes navegar a la siguiente página para ejecutar el callback.

  • Callack en computación es cualquier código ejecutable que se pasa como argumento en otro. EN¿n nuestro caso la función follow espera a que se termine el parseo para ejecutarse despue´s dle Requests.

  • Scrapy tiene una funcionalidad llamada 'FEED EXPORT' que en otra palabras es un ficcionario que me permitirá alimentarlo con diferentes formatos de serialización ( JSON, XML, CSV, PIckle, JL, Marshal…) cada formato de serialización tiene sus reglas, inclusive puedes almacenar directamente con S3, GCS y más. ¿Quieres aprender más?



import scrapy


class Experiment(scrapy.Spider):
    name = 'Experiment_2'
    start_urls = ['...quotes.toscrape.com/page/1']
    """ custom_settings = {
        'FEED_URI':'quotes.json',
        'FEED_FORMAT': 'json',

    } """
    custom_settings = {
        'FEEDS': {
            'quotes.json': {
                'format': 'json',
                'encoding': 'utf8',
                'store_empty': False,
                'fields': None,
                'indent': 4,
                'item_export_kwargs': {
                    'export_empty_fields': True,
                },
            },
        },
    }

    def parse(self,response):
        # Title Web page
        title = response.xpath('//h1/a/text()').get()

        # Quote
        authors = response.xpath('//small[@class="author"]/text()').getall()
        texts = response.xpath('//span[@class="text"]/text()').getall()
        tags = "For scrap"
        scraped = {'Authors': authors,'Text':texts, 'Tags':tags}
        yield scraped


        next_page = response.xpath('//li[@class="next"]/a/@href').get()
        if next_page:
            # Call back es una función que se ejcuta después de la request
            # Follow sigue el hipervínculo.
            yield response.follow(next_page, callback= self.parse)

La utilizacion de FEED_URI y FEED_FORMAT aunque aun sirve; se considera obsoleta a dia de hoy (feb-22). Podemos utilizar el siguiente comando para establecer el formato de salida y nombre del archivo.

#Es importante respetar las doble comilla y las mayusculas
"FEEDS":{"Nombre.json":{"format":"json"}}

En MacOS el comando para darle formato al archivo json es:

shift + option + f

Scrapeando varias paginas

next_page_button_link = response.xpath('//li[@class="next"]/a/@href').get()
        # Importante preguntar si la variable next_page_button_link contiene algo 
				# ya que por logica en algun momento llegariamos a ultima pagina.
        if next_page_button_link:
            # El metodo follow nos permite seguir al link (lo que hace scrapy es 
						# dejar la url absoluta y cambiar el resto) 
            # Este metodo posee un callback es decir un metodo que se ejecutara 
						# automaticamente despues de haber cambiado de url.
            yield response.follow(next_page_button_link, callback=self.parse)

Otra forma de agregar los settings del archivo a generar en custom_settings

custom_settings = {
        'FEEDS': {
            'quotes.json': {
                'format': 'json',
                'encoding': 'utf8',
                'fields': ['title', 'quotes', 'top_ten_tags'],
                'overwrite': True
            }
        }
    }

Desde Scrapy 2.1.0 (2020-04-24), FEED_URI y FEED_FORMAT están obsoletos y debe implementarse FEEDS. Sin embargo no encuentro cómo hacer la actualización requerida. Me ayudan?

💚
En MacOS el comando para darle formato al archivo json es:
shift + option + f

Por alguna razón no soy capaz de agregar más información al diccionario. Estoy queriendo agregar los autores, pero a pesar de que tengo bien el xpath, y que puedo imprimir en pantalla la lista de autores, por alguna razón el archivo json decide ignorar la linea " ‘authors’: autores," . No le encuentro solución.

Según lo que he visto, en el comando

scrapy crawl quotes

La orden crawl, proviene de web crawling que puede llegar a ser un sinonimo de web scraping, crawling en ingles hace referencia como arañar o rasguñar, y en este contexto seria como arañar la red, por ello también se puede relacionar con el concepto de arañas (spiders) en scrapy y en general en el de web crawling.

El ejercicio esta muy bacano

Qué capo!

custom_settings = {
        'FEED_URI' : 'quotes.json',
        'FEED_FORMAT' : 'json'
    }```

from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.selector import XmlXPathSelector

class MySpider(BaseSpider):
name = ‘myspider’

   def parse(self, response):
       xxs = XmlXPathSelector(response)
       links = xxs.select("//link/text()").extract()
       return [Request(x, callback=self.parse_link) for x in links]