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.

Mejores prácticas de Scrapy para rastrear sitios de paginación.

Estoy creando un rastreador para html.

Cada página tiene una etiqueta como esta,

Siguiente >>

y en la última página no hay esta etiqueta.

¿Cómo puedo obtener cada página?

Al principio, pensé que sería así, sin embargo, por alguna razón, no se llama a self.start_request al final.

page = 0
def start_requests(self, page=0):
    urls = ['https://www.exmaple.com/page={0}'.format(page)]
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
    # ¿Comprobar si hay una etiqueta <a??
    xlink = LinkExtractor()
    for link in xlink.extract_links(response):
        yield scrapy.Request(url=link.url, callback=self.parse_each)

    if hay una etiqueta:
       page = page + 1
       self.start_request(page)

¿Cuál es la mejor práctica para hacer este rastreo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para rastrear todas las páginas sin perder ninguna, la mejor práctica sería utilizar un bucle en el método start_requests, donde el número de páginas para rastrear se obtiene analizando primero la primera página para obtener el número total de páginas disponibles, y luego utilizando una función de rango para recorrer todas las páginas.

    Aquí tienes un ejemplo:

    def start_requests(self):
        url = 'https://www.example.com/page=0'
        yield scrapy.Request(url=url, callback=self.parse_main)
    
    def parse_main(self, response):
        # verificar el número de la última página
        last_page = int(response.css('a[href*="page="]::text').extract()[-1])
    
        # recorrer todas las páginas utilizando range
        for page in range(1, last_page + 1):
            url = f"https://www.example.com/page={page}"
            yield scrapy.Request(url=url, callback=self.parse_each)
    
    def parse_each(self, response):
        # analizar cada página como antes
    

    En este código, el método parse_main se llama primero con el método start_requests, que solicita la primera página (page=0) y luego la analiza para obtener el número total de páginas. Luego, recorre todas las páginas utilizando la función range y emite un objeto de solicitud para cada una de ellas, llamando al método parse_each para analizar cada página. Esto garantiza que se rastreen todas las páginas sin necesidad de recursión o llamadas explícitas al método start_requests.

Comments are closed.