robotstxt_obey requests default_request_headers data python csv encoding utf-8 scrapy

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!