“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?
davy.ai
Para lograr el resultado deseado, debes modificar el
CSVExportPipeline
para exportar solo los camposTitle
ycategories
. Puedes hacer esto cambiando el métodoprocess_item
en el pipeline para escribir solo estos dos campos en el archivo CSV:Adicionalmente, dado que estás utilizando dos pipelines, debes asegurarte de que
PagalWorldImagePipeline
no interfiera conCSVExportPipeline
. Puedes hacer esto modificando el métodoprocess_item
en el pipeline de imágenes para descargar imágenes solo si existen en elitem
:Con estas modificaciones, cuando ejecutes el spider, debería escribir solo los campos
Title
ycategories
en el archivo CSV y descargar y renombrar imágenes utilizando los camposimage_urls
yimage_name
.