如何防止Scrapy对请求URL进行编码

10 投票
1 回答
2916 浏览
提问于 2025-04-18 14:14

我希望Scrapy在发送请求时不要对我的网址进行编码。我发现scrapy.http.Request这个模块引入了scrapy.utils.url,而这个又引入了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)

1 个回答

3

我想要不对 [] 进行编码,所以我做了这个。

在创建一个 Request 对象时,scrapy 会应用一些网址编码的方法。如果你想要恢复这些编码,可以使用自定义的中间件来根据自己的需求修改网址。

你可以像这样使用一个 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 文件。你需要根据自己的环境进行调整。

感谢:Frank Martin

撰写回答