Scrapy: crea una estructura de carpetas a partir de las imágenes descargadas según la URL desde la que se descargan las imágenes.

Tengo una serie de enlaces que definen la estructura de un sitio web. Al descargar imágenes de estos enlaces, quiero colocar simultáneamente las imágenes descargadas en una estructura de carpetas similar a la estructura del sitio web, y no solo cambiar su nombre (como se responde enDescarga de imágenes desagradables cómo utilizar un nombre de archivo personalizado)

Mi código para el mismo es así:

class MyImagesPipeline(ImagesPipeline):
    """Custom image pipeline to rename images as they are being downloaded"""
    page_url=None
    def image_key(self, url):
        page_url=self.page_url
        image_guid = url.split('/')[-1]
        return '%s/%s/%s' % (page_url,image_guid.split('_')[0],image_guid)

    def get_media_requests(self, item, info):
        #http://store.abc.com/b/n/s/m
        os.system('mkdir '+item['sku'][0].encode('ascii','ignore'))
        self.page_url = urlparse(item['start_url']).path #I store the parent page's url in start_url Field
        for image_url in item['image_urls']:
            yield Request(image_url)

Crea la estructura de carpetas requerida, pero cuando entro en las carpetas en detalle, veo que los archivos se han extraviado en las carpetas.

Sospecho que está ocurriendo porque las funciones "get_media_requests" y "image_key" pueden ejecutarse de forma asíncrona, por lo que el valor de "page_url" cambia antes de que lo utilice la función "image_key"

Respuestas a la pregunta(1)

Su respuesta a la pregunta