【问题标题】:How to prevent Scrapy from URL encoding request URLs如何防止 Scrapy 对请求 URL 进行 URL 编码
【发布时间】:2014-09-13 01:47:44
【问题描述】:

我希望 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)

【问题讨论】:

  • 我遇到了这个问题,因为 Web 服务器只接受未编码的逗号,但 Scrapy 将链接中的逗号转换为 %2C。
  • 我需要快速解决这个问题,所以我将 self._url = self._url.replace('%2C', ',') 添加到 Request._set_url() 中。从同一个函数中删除 safe_url_string(url) 调用没有帮助。
  • 有什么解决办法吗? ...我需要它

标签: python url scrapy url-encoding web-crawler


【解决方案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。您需要根据您的环境调整它们。

归功于:Frank Martin

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2023-02-07
    • 2017-07-12
    相关资源
    最近更新 更多