Paginación usando Scrapy – Web Scraping con Python

Paginación con Scrapy. El raspado web es una técnica para obtener información de sitios web. Scrapy se utiliza como un marco de Python para el raspado web. Obtener datos de un sitio web normal es más fácil y se puede lograr simplemente extrayendo HTMl del sitio web y obteniendo datos filtrando etiquetas. Pero, en caso de que haya paginación en los datos que está tratando de obtener, por ejemplo, los productos de Amazon pueden tener varias páginas y para desechar todos los productos con éxito, se necesitaría el concepto de paginación.

Paginación: la paginación, también conocida como paginación, es el proceso de dividir un documento en páginas discretas, lo que significa un paquete de datos en una página diferente. Estas diferentes páginas tienen su propia URL. Entonces, debemos tomar estas URL una por una y raspar estas páginas. Pero a tener en cuenta es cuándo detener la paginación. En general, las páginas tienen el botón siguiente, este botón siguiente está habilitado y se desactiva cuando las páginas finalizan. Este método se usa para obtener la URL de las páginas hasta que el botón de la página siguiente sea capaz y cuando se deshabilite, no queda ninguna página para raspar.

Proyecto para aplicar paginación usando scrapy

Extrayendo detalles móviles del sitio de Amazon y aplicando paginación en el siguiente proyecto a continuación.
Los detalles raspados involucran el nombre y el precio de los móviles y la paginación para raspar todo el resultado de la siguiente URL buscada

Lógica detrás de la paginación:
Aquí, la variable next_page obtiene la URL de la página siguiente solo si la página siguiente está disponible, pero si no queda ninguna página, esto si la condición es falsa.

next_page = response.xpath("//div/div/ul/li[@class='alast']/a/@href").get()
if next_page:
    abs_url = f"https://www.amazon.in{next_page}"
yield scrapy.Request(
    url=abs_url,
    callback=self.parse
)

Nota:

abs_url = f"https://www.amazon.in{next_page}"

Aquí es necesario tomar https://www.amazon.in porque next_page es /page2. Eso está incompleto y la URL completa es https://www.amazon.in/page2

  • Obtener xpath de los detalles debe rasparse:
    siga los pasos a continuación para obtener xpath:
    xpath de los elementos:

    xpath del nombre:

    xpath del precio:

    xpath de la página siguiente:

  • Spider Code: raspar el nombre y el precio del sitio de Amazon y aplicar la paginación en el siguiente código.

    import scrapy
      
    class MobilesSpider(scrapy.Spider):
        name = 'mobiles'
        # create request object initially
        def start_requests(self):
            yield scrapy.Request(
                url ='https://www.amazon.in / s?k = xiome + mobile + phone&crid'\
                + '= 2AT2IRC7IKO1K&sprefix = xiome % 2Caps % 2C302&ref = nb_sb_ss_i_1_5',
                callback = self.parse
            )
      
        #  parse products
        def parse(self, response):
            products = response.xpath("//div[@class ='s-include-content-margin s-border-bottom s-latency-cf-section']")
            for product in products:
                yield {
                    'name': product.xpath(".//span[@class ='a-size-medium a-color-base a-text-normal']/text()").get(),
                    'price': product.xpath(".//span[@class ='a-price-whole']/text()").get()
                }
      
            print()
            print("Next page")
            print()
            next_page = response.xpath("//div / div / ul / li[@class ='a-last']/a/@href").get()
            if next_page:
                abs_url = f"https://www.amazon.in{next_page}"
                yield scrapy.Request(
                    url = abs_url,
                    callback = self.parse
                )
            else:
                print()
                print('No Page Left')
                print()

Resultados raspados:

Publicación traducida automáticamente

Artículo escrito por Versus y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *