es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo sé cuál URL se está utilizando en starts_url (Scrapy)?

Estoy construyendo un Scrapy que rastrea dos páginas (por ejemplo: PageDucky, PageHorse) y paso esas dos páginas en un campo starts_url. Pero para la paginación, necesito pasar mi URL y concatenar con “?page=”, así que no puedo pasar toda la lista completa. Ya intenté hacer un bucle for, pero sin éxito. ¿Alguien sabe cómo puedo hacer que la paginación funcione para ambas páginas?

Aquí está mi código por ahora:

class QuotesSpider(scrapy.Spider):
    name = 'QuotesSpider'
    start_urls = ['https://PageDucky.com', 'https://PageHorse.com']
    categories = []
    count = 1

def parse(self, response):

    # Obtener categorías
    urli = response.url
    QuotesSpider.categories = urli[urli.find('/browse')+7:].split('/')
    QuotesSpider.categories.pop(0)

    # OBTENER ÍTEMS POR PÁGINA Y CALCULAR LA PAGINACIÓN
    items = int(response.xpath(
            '*//div[@id="body"]/div/label[@class="item-count"]/text()').get().replace(' items', ''))
    pages = items / 10

    # LLAMAR A OTRA FUNCIÓN PARA LEER LA PROPIA PÁGINA
    for i in response.css('div#body div a::attr(href)').getall():
        if i[:5] == '/item':
            yield scrapy.Request('http://mainpage' + i, callback=self.parseobj)

    # AQUÍ ESTÁ EL PROBLEMA, PROBÉ Y SIN EL BUCLE FOR FUNCIONA SOLO CON UNA URL
    for y in QuotesSpider.start_urls:
        if pages >= QuotesSpider.count:
            next_page = y + '?page=' + str(QuotesSpider.count)
            QuotesSpider.count = QuotesSpider.count + 1
            yield scrapy.Request(next_page, callback=self.parse)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que la paginación funcione en ambas páginas, puede modificar el bucle for en su código que actualmente itera a través de los start_urls. En lugar de usar la lista start_urls, puede crear una nueva lista que contenga la URL base para cada página y usarla para generar las URL de paginación. Aquí hay un ejemplo:

    class QuotesSpider(scrapy.Spider):
        name = 'QuotesSpider'
        start_urls = ['https://PageDucky.com', 'https://PageHorse.com']
        base_urls = ['http://mainpageDucky.com', 'http://mainpageHorse.com']
        categories = []
        count = 1
    
        def parse(self, response):
            # Obtener las categorías
            urli = response.url
            QuotesSpider.categories = urli[urli.find('/browse')+7:].split('/')
            QuotesSpider.categories.pop(0)
    
            # OBTENER ELEMENTOS POR PÁGINA Y CALCULAR LA PAGINACIÓN
            items = int(response.xpath(
                    '*//div[@id="body"]/div/label[@class="item-count"]/text()').get().replace(' items', ''))
            pages = items / 10
    
            # LLAMA EL OTRO DEF PARA LEER LA PÁGINA EN SÍ
            for i in response.css('div#body div a::attr(href)').getall():
                if i[:5] == '/item':
                    yield scrapy.Request('http://mainpage' + i, callback=self.parseobj)
    
            # GENERAR URLS DE PAGINACIÓN
            for i in range(len(QuotesSpider.base_urls)):
                for j in range(1, pages+1):
                    next_page = QuotesSpider.base_urls[i] + '?page=' + str(j)
                    yield scrapy.Request(next_page, callback=self.parse)
    

    En este código modificado, creamos una nueva lista llamada base_urls que contiene la URL base para cada página (http://mainpageDucky.com y http://mainpageHorse.com). Luego, usamos esta lista para generar las URL de paginación usando un bucle for anidado. El bucle externo itera a través de cada URL base, y el bucle interno genera las URL de paginación para cada página hasta el número total de páginas calculado anteriormente. Al hacer esto, generamos URL de paginación para ambas páginas y nos aseguramos de que la paginación funcione como se espera.

Comments are closed.