python - default_request_headers - scrapy requests
Problemas al escribir datos raspados en csv con caracteres eslavos(UnicodeEncodeError & TypeError) (1)
Lo que uso para raspar los sitios web checos y evitar estos errores es el módulo unidecode . Lo que hace este módulo es una transliteración ASCII de texto Unicode.
# -*- coding: utf-8 -*-
from unidecode import unidecode
class BezrealitkySpider(scrapy.Spider):
name = ''bezrealitky''
start_urls = [
''https://www.bezrealitky.cz/vypis/nabidka-prodej/byt/praha''
]
def parse(self, response):
item = BezrealitkyItem()
items = []
for records in response.xpath(''//*[starts-with(@class,"record")]''):
item[''title''] = unidecode(response.xpath(''.//div[@class="details"]/h2/a[@href]/text()'').extract()[1].encode(''utf-8''))
items.append(item)
return(items)
Dado que uso un ItemLoader mi código se ve así:
# -*- coding: utf-8 -*-
from scrapy.loader import ItemLoader
class BaseItemLoader(ItemLoader):
title_in = MapCompose(unidecode)
Resultado intencionado / deseado:
Para raspar los títulos del enlace (es decir, el texto de los enlaces con cada elemento) desde un sitio web checo:
https://www.bezrealitky.cz/vypis/nabidka-prodej/byt/praha
E imprima el resultado en un archivo CSV. Preferiblemente en una lista para que luego pueda manipular los datos en otro modelo de análisis de datos de Python.
Resultado / Problema:
Obtengo un UnicodeEncodeError y un TypeError. Sospecho que esto tiene que ver con los caracteres no normales que existen en el idioma checo. Por favor, ver más abajo para traceback.
Rastrear:
TypeError Traceback:
2017-01-19 08:00:18 [scrapy] ERROR: Error processing {''title'': b''/n Ob/xc4/x9bt/xc3/xad 6. kv/xc4/x9b''
b''tna, Praha - Kr/xc4/x8d ''}
Traceback (most recent call last):
File "C:/Users/phili/Anaconda3/envs/py35/lib/site-packages/twisted/internet/defer.py", line 651, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "C:/Users/phili/Documents/Python Scripts/Scrapy Spiders/bezrealitky/bezrealitky/pipelines.py", line 24, in process_item
self.exporter.export_item(item)
File "C:/Users/phili/Anaconda3/envs/py35/lib/site-packages/scrapy/exporters.py", line 193, in export_item
self._write_headers_and_set_fields_to_export(item)
File "C:/Users/phili/Anaconda3/envs/py35/lib/site-packages/scrapy/exporters.py", line 217, in _write_headers_and_set_fields_to_export
self.csv_writer.writerow(row)
File "C:/Users/phili/Anaconda3/envs/py35/lib/codecs.py", line 718, in write
return self.writer.write(data)
File "C:/Users/phili/Anaconda3/envs/py35/lib/codecs.py", line 376, in write
data, consumed = self.encode(object, self.errors)
TypeError: Can''t convert ''bytes'' object to str implicitly
UnicodeEncodeError Traceback:
2017-01-19 08:00:18 [scrapy] ERROR: Error processing {''title'': b''/n Ob/xc4/x9bt/xc3/xad 6. kv/xc4/x9b''
b''tna, Praha - Kr/xc4/x8d ''}
Traceback (most recent call last):
File "C:/Users/phili/Anaconda3/envs/py35/lib/site-packages/twisted/internet/defer.py", line 651, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "C:/Users/phili/Documents/Python Scripts/Scrapy Spiders/bezrealitky/bezrealitky/pipelines.py", line 24, in process_item
self.exporter.export_item(item)
File "C:/Users/phili/Anaconda3/envs/py35/lib/site-packages/scrapy/exporters.py", line 198, in export_item
self.csv_writer.writerow(values)
File "C:/Users/phili/Anaconda3/envs/py35/lib/encodings/cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: ''charmap'' codec can''t encode character ''/u011b'' in position 37: character maps to <undefined>
Situación / Proceso:
Estoy ejecutando el crawler crawl bezrealitky (es decir, el nombre de la araña). He configurado el pipeline con un CSVItemExporter que encontré en Internet, y traté de adaptarlo a la codificación UTF-8 al abrir el archivo (también lo intenté al principio sin agregar UTF-8, pero sí el mismo error).
Mi código de tubería:
from scrapy.conf import settings
from scrapy.exporters import CsvItemExporter
import codecs
class CsvPipeline(object):
def __init__(self):
self.file = codecs.open("booksdata.csv", ''wb'', encoding=''UTF-8'')
self.exporter = CsvItemExporter(self.file)
self.exporter.start_exporting()
def close_spider(self, spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
Mi archivo de configuración:
BOT_NAME = ''bezrealitky''
SPIDER_MODULES = [''bezrealitky.spiders'']
NEWSPIDER_MODULE = ''bezrealitky.spiders''
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
''bezrealitky.pipelines.CsvPipeline'': 300,
Mi código araña:
class BezrealitkySpider(scrapy.Spider):
name = ''bezrealitky''
start_urls = [
''https://www.bezrealitky.cz/vypis/nabidka-prodej/byt/praha''
]
def parse(self, response):
item = BezrealitkyItem()
items = []
for records in response.xpath(''//*[starts-with(@class,"record")]''):
item[''title''] = response.xpath(''.//div[@class="details"]/h2/a[@href]/text()'').extract()[1].encode(''utf-8'')
items.append(item)
return(items)
Soluciones probadas hasta ahora:
- Para agregar y eliminar .encode (''utf-8) al comando extract (), y también en el pipeline.py pero no funcionó.
- También intenté agregar # - - codificación: utf-8 - - al principio, tampoco funcionó
Traté de cambiar el código de python a utf-8 en la consola con esto:
chcp 65001
establecer PYTHONIOENCODING = utf-8
Conclusión:
No puedo obtener los datos eliminados para escribir en el archivo CSV, se crea el CSV pero no hay nada en él. A pesar de que en el intérprete de comandos puedo ver que los datos se eliminan pero no se decodifican / codifican correctamente y arrojan un error antes de que se escriban en el archivo.
Soy un completo principiante con esto, solo trato de elegir Scrapy. Realmente agradecería cualquier ayuda que pueda obtener!