spider how follow example create csv scrapy

csv - how - scrapy follow



Python Scrapy: cómo hacer que CSVItemExporter escriba columnas en un orden específico (2)

En Scrapy, tengo mis artículos especificados en un cierto orden en items.py, y mi araña tiene esos artículos nuevamente en el mismo orden. Sin embargo, cuando ejecuto la araña y guardo los resultados como una csv, el orden de la columna de items.py o la araña no se mantiene. ¿Cómo puedo obtener el CSV para mostrar columnas en un orden específico? El código de ejemplo sería muy apreciado.

Gracias.


Esto está relacionado con la modificación de la exportación de CSV en scrapy

El problema es que el exportador se crea una instancia sin ningún parámetro de palabra clave, por lo que las palabras clave como EXPORT_FIELDS se ignoran. La solución es la misma: debe crear una subclase del exportador de elementos de CSV para pasar los parámetros de palabra clave.

Siguiendo la receta anterior, creé un nuevo archivo xyzzy / feedexport.py (cambie "xyzzy" a lo que sea que se llame su clase de tratamiento):

""" The standard CSVItemExporter class does not pass the kwargs through to the CSV writer, resulting in EXPORT_FIELDS and EXPORT_ENCODING being ignored (EXPORT_EMPTY is not used by CSV). """ from scrapy.conf import settings from scrapy.contrib.exporter import CsvItemExporter class CSVkwItemExporter(CsvItemExporter): def __init__(self, *args, **kwargs): kwargs[''fields_to_export''] = settings.getlist(''EXPORT_FIELDS'') or None kwargs[''encoding''] = settings.get(''EXPORT_ENCODING'', ''utf-8'') super(CSVkwItemExporter, self).__init__(*args, **kwargs)

y luego lo agregué a xyzzy / settings.py:

FEED_EXPORTERS = { ''csv'': ''xyzzy.feedexport.CSVkwItemExporter'' }

Ahora el exportador de CSV respetará la configuración de EXPORT_FIELD, también agregará a xyzzy / settings.py:

# By specifying the fields to export, the CSV export honors the order # rather than using a random order. EXPORT_FIELDS = [ ''field1'', ''field2'', ''field3'', ]


No sabría sobre la hora en que hizo su pregunta, pero ahora Scrapy proporciona un atributo fields_to_export a la clase BaseItemExporter , de la cual CsvItemExporter hereda. Según la versión 0.22:

fields_to_export

Una lista con el nombre de los campos que se exportarán o None si desea exportar todos los campos. El valor predeterminado es Ninguno.

Algunos exportadores (como CsvItemExporter ) respetan el orden de los campos definidos en este atributo.

Consulte también la documentación para BaseItemExporter y CsvItemExporter en el sitio web de Scrapy.

Sin embargo, para usar esta característica, deberá crear su propia ItemPipeline, como se detalla en esta respuesta