requests - scrapy sitemapspider
Cómo ordenar la salida de csv de scrapy al usar los archivos item pipeline (2)
Después de mucha ayuda de la comunidad SO, tengo un rastreador de scrapy que guarda la página web del sitio que rastrea, pero me gustaría limpiar el archivo csv que se crea --output
Una fila de muestra se ve actualmente como
"[{''url'': ''http://example.com/page'', ''path'': ''full/hashedfile'', ''checksum'': ''checksumvalue''}]",http://example.com/page,2016-06-20 16:10:24.824000,http://example.com/page,My Example Page
¿Cómo obtengo que el archivo csv contenga detalles en 1 archivo por línea (sin URL adicional) y el valor de ruta incluye una extensión como .html o .txt?
my items.py es el siguiente
class MycrawlerItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
crawldate = scrapy.Field()
pageurl = scrapy.Field()
files = scrapy.Field()
file_urls = scrapy.Field()
Mi devolución de reglas es
def scrape_page(self,response):
page_soup = BeautifulSoup(response.body,"html.parser")
ScrapedPageTitle = page_soup.title.get_text()
item = MycrawlerItem()
item[''title''] =ScrapedPageTitle
item[''crawldate''] = datetime.datetime.now()
item[''pageurl''] = response.url
item[''file_urls''] = [response.url]
yield item
En el registro de rastreador, se muestra
2016-06-20 16:10:26 [scrapy] DEBUG: Scraped from <200 http://example.com/page>
{''crawldate'': datetime.datetime(2016, 6, 20, 16, 10, 24, 824000),
''file_urls'': [''http://example.com/page''],
''files'': [{''checksum'': ''checksumvalue'',
''path'': ''full/hashedfile'',
''url'': ''http://example.com/page''}],
''pageurl'': ''http://example.com/page'',
''title'': u''My Example Page''}
La estructura ideal para cada línea de csv sería
crawldate, file_url, file_path, title
Pude evitar la necesidad de limpiar los datos csv especificando la opción de salida xml en lugar de csv
La salida como .xml y luego la importación a Excel me dio un conjunto de datos más limpio de 1 fila por página y sin caracteres de puntuación adicionales para preprocesar
Si desea formatos personalizados, tal vez desee simplemente utilizar tuberías de artículos de gran calidad.
en los métodos de tuberías process_item
o close_spider
puede escribir su artículo en el archivo. Me gusta:
def process_item(self, item, spider):
if not getattr(spider, ''csv'', False):
return item
with open(''{}.csv''.format(spider.name), ''a'') as f:
writer = csv.writer(f)
writer.writerow([item[''crawldate''],item[''title'']])
return item
Esto escribirá el <spider_name>.csv
cada vez que ejecute la araña con la bandera csv
, es decir, scrapy crawl twitter -a csv=True
Puedes hacerlo más eficiente si abres un archivo en el método spider_open
y lo cierras en spider_close
, pero es lo mismo si no lo spider_close
.