Cómo evitar que Scrapy de URL solicite la encoding URL

Me gustaría que Scrapy no codificara mis solicitudes de URL. Veo que scrapy.http.Request está importando scrapy.utils.url que importa w3lib.url que contiene la variable _ALWAYS_SAFE_BYTES. Solo necesito agregar un conjunto de caracteres a _ALWAYS_SAFE_BYTES, pero no estoy seguro de cómo hacerlo desde dentro de mi clase de araña.

scrapy.http.Request línea relevante:

fp.update(canonicalize_url(request.url)) 

canonicalize_url es de scrapy.utils.url, línea relevante en scrapy.utils.url:

 path = safe_url_string(_unquotepath(path)) or '/' 

safe_url_string () es de w3lib.url, líneas relevantes en w3lib.url:

 _ALWAYS_SAFE_BYTES = (b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-') 

dentro de w3lib.url.safe_url_string ():

 _safe_chars = _ALWAYS_SAFE_BYTES + b'%' + _reserved + _unreserved_marks return moves.urllib.parse.quote(s, _safe_chars) 

No quería codificar [ y ] e hice esto.

Cuando se crea un objeto de solicitud, se aplican algunos métodos de encoding de url. Para revertirlos, puede utilizar un middleware personalizado y cambiar la url a sus necesidades.

Podrías usar un Downloader Middleware como este:

 class MyCustomDownloaderMiddleware(object): def process_request(self, request, spider): request._url = request.url.replace("%5B", "[", 2) request._url = request.url.replace("%5D", "]", 2) 

No te olvides de “activar” el middleware en settings.py así:

 DOWNLOADER_MIDDLEWARES = { 'so.middlewares.MyCustomDownloaderMiddleware': 900, } 

Mi proyecto se llama so y en la carpeta hay un archivo middlewares.py . Necesitas ajustar eso a tu entorno.

El crédito es para: Frank Martin