我希望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)
答案 0 :(得分:1)
我想不对[
和]
进行编码,我就这样做了。
创建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,
}
我的项目名为so
,文件夹中有一个文件middlewares.py
。您需要根据您的环境进行调整。
信用证转到:Frank Martin