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.

“No se pueden utilizar las tuberías csv y pipelines de imágenes correctamente dentro de una araña.”

Estoy tratando de encontrar alguna manera de escribir los primeros dos campos en un archivo CSV y usar los últimos dos campos para descargar imágenes en una carpeta al mismo tiempo. He creado dos ductos personalizados para lograr eso.

Este es el spider:

import scrapy

class PagalWorldSpider(scrapy.Spider):
    name = 'pagalworld'
    start_urls = ['https://www.pagalworld.pw/indian-pop-mp3-songs-2021/files.html']

    custom_settings = {
        'ITEM_PIPELINES': {
            'my_project.pipelines.PagalWorldImagePipeline': 1,
            'my_project.pipelines.CSVExportPipeline': 300
        },
        'IMAGES_STORE': r"C:\Users\WCS\Desktop\Images",
    }

    def start_requests(self):
        for start_url in self.start_urls:
            yield scrapy.Request(start_url,callback=self.parse)

    def parse(self, response):
        for item in response.css(".files-list .listbox a[href]::attr(href)").getall():
            inner_page_link = response.urljoin(item)
            yield scrapy.Request(inner_page_link,callback=self.parse_download_links)

    def parse_download_links(self,response):
        title = response.css("h1.title::text").get()
        categories = ', '.join(response.css("ul.breadcrumb > li > a::text").getall())

        file_link = response.css(".file-details audio > source::attr(src)").get()
        image_link = response.urljoin(response.css(".alb-img-det > img[data-src]::attr('data-src')").get())
        image_name = file_link.split("-")[-1].strip().replace(" ","_").replace(".mp3","")

        yield {"Title":title,"categories":categories,"image_urls":[image_link],"image_name":image_name}

Si ejecuto el script tal como está, obtengo los cuatro campos en un archivo CSV, los campos que estoy entregando dentro del método parse_download_links. El script también está descargando y renombrando las imágenes con precisión.

Los primeros dos campos Title y categories son los que deseo escribir en el archivo CSV, no image_urls y image_name. Sin embargo, estos dos campos image_urls y image_name deben utilizarse para descargar y renombrar las imágenes.

¿Cómo puedo utilizar ambos ductos correctamente?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, debes modificar el CSVExportPipeline para exportar solo los campos Title y categories. Puedes hacer esto cambiando el método process_item en el pipeline para escribir solo estos dos campos en el archivo CSV:

    class CSVExportPipeline:
    
        def __init__(self):
            self.file = open("output.csv", "w", encoding="utf-8")
            self.exporter = CsvItemExporter(self.file, fields_to_export=["Title", "categories"])
            self.exporter.write_header()
    
        def process_item(self, item, spider):
            self.exporter.export_item(item)
            return item
    
        def close_spider(self, spider):
            self.file.close()
    

    Adicionalmente, dado que estás utilizando dos pipelines, debes asegurarte de que PagalWorldImagePipeline no interfiera con CSVExportPipeline. Puedes hacer esto modificando el método process_item en el pipeline de imágenes para descargar imágenes solo si existen en el item:

    class PagalWorldImagePipeline:
    
        def get_media_requests(self, item, info):
            if 'image_urls' in item:
                for image_url in item['image_urls']:
                    yield scrapy.Request(image_url)
    
        def file_path(self, request, response=None, info=None):
            url = request.url
            media_ext = os.path.splitext(url)[1]
            return f"{request.meta['image_name']}{media_ext}"
    

    Con estas modificaciones, cuando ejecutes el spider, debería escribir solo los campos Title y categories en el archivo CSV y descargar y renombrar imágenes utilizando los campos image_urls y image_name.

Comments are closed.