Как запретить Scrapy кодировать URL-адреса запросов URL-адресов

Я бы хотел, чтобы Scrapy не кодировал URL-адреса моих запросов. Я вижу, что scrapy.http.Request импортирует scrapy.utils.url, который импортирует w3lib.url, содержащий переменную _ALWAYS_SAFE_BYTES. Мне просто нужно добавить набор символов в _ALWAYS_SAFE_BYTES, но я не уверен, как это сделать из моего класса пауков.

scrapy.http.Request соответствующая строка:

fp.update(canonicalize_url(request.url))

canonicalize_url взят из scrapy.utils.url, соответствующая строка в scrapy.utils.url:

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

safe_url_string() из w3lib.url, соответствующие строки в w3lib.url:

_ALWAYS_SAFE_BYTES = (b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-')

внутри w3lib.url.safe_url_string():

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

person flyingtriangle    schedule 22.07.2014    source источник
comment
Я столкнулся с этой проблемой, потому что веб-сервер принимает запятую только в незакодированном виде, но Scrapy переводит ее в ссылки в% 2C.   -  person Seppo Enarvi    schedule 19.11.2014
comment
Мне нужно было быстро обойти эту проблему, поэтому я добавил self._url = self._url.replace('%2C', ',') в Request._set_url(). Удаление вызова safe_url_string(url) из той же функции не помогло.   -  person Seppo Enarvi    schedule 19.11.2014
comment
Любое решение? ... Мне это нужно   -  person Umair Ayub    schedule 24.02.2017


Ответы (1)


Я хотел не кодировать [ и ] и сделал это.

При создании объекта Request scrapy применяет некоторые методы кодирования URL. Чтобы вернуть их, вы можете использовать специальное промежуточное ПО и изменить URL-адрес в соответствии с вашими потребностями.

Вы можете использовать Downloader Middleware следующим образом:

class MyCustomDownloaderMiddleware(object):

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

Не забудьте «активировать» промежуточное ПО в settings.py следующим образом:

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

Мой проект называется so и в папке есть файл middlewares.py. Вам нужно адаптировать их к вашей среде.

Кредит принадлежит: Фрэнк Мартин

person Umair Ayub    schedule 27.02.2017