如何防止URL编码请求URL的Scrapy

我希望Scrapy不对我的请求进行URL编码.我看到scrapy.http.Request正在导入scrapy.utils.url,它导入包含变量_ALWAYS_SAFE_BYTES的w3lib.url.我只需要为_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)
我想不要编码[和],我做了这个.

在创建Request对象时,scrapy应用了一些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,
}

我的项目是这样命名的,在文件夹中有一个文件middlewares.py.您需要根据您的环境调整这些.

积分转到:Frank Martin

相关文章
相关标签/搜索