如何防止Scrapy对请求URL进行编码
我希望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