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.

Scrapy obteniendo valores de otros enlaces

def parse(self, response):
lista = {
“name”: response.css(“#title::text”).extract_first(),
“images”: []
}

for image in response.css("#images_link a::attr(href)").extract():
    lista["images"].append(yield scrapy.Request(url=image, callback=self.parse_image))

yield lista

def parse_image(self, response):
return [response.css(“img::attr(alt)”).extract(), response.css(“img::attr(src)”).extract()]

Quiero extraer información de una página y también rastrear algunos de sus enlaces hijos y añadirlos al objeto principal “lista”, pero en lugar de obtener solo un objeto, me devuelve muchos. ¿Cómo puedo hacerlo correctamente?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para adjuntar los enlaces secundarios al objeto principal de list, puedes crear una lista separada para almacenar los resultados de parse_image para cada enlace secundario, y luego añadir esa lista a la clave list["images"]. Aquí tienes una versión actualizada del método parse:

    def parse(self, response):
        list = {
            "name": response.css("#title::text").extract_first(),
            "images": []
        }
    
        image_requests = [scrapy.Request(url=image, callback=self.parse_image) for image in response.css("#images_link a::attr(href)").extract()]
        for request in image_requests:
            yield request
    
        # Esperar hasta que se completen todas las solicitudes de imágenes
        for result in image_requests:
            list["images"].append(result.result())
    
        yield list
    
    def parse_image(self, response):
        return [response.css("img::attr(alt)").extract_first(), response.css("img::attr(src)").extract_first()]
    

    Aquí, image_requests es una lista de objetos de solicitud, que se emiten y se envían al método parse_image. En lugar de emitir los resultados de parse_image directamente, simplemente almacenamos cada resultado en una lista. Después de que se hayan completado todas las solicitudes de imágenes, iteramos sobre la lista de resultados y la añadimos a la clave list["images"]. De esta manera, solo emitimos un objeto al final del método parse.

Comments are closed.