如何从scrapy响应中获取cookie并将cookie设置为下一个请求?

Man*_*lam 10 python cookies redirect scrapy

我已禁用Default Scrapy cookie选项,因此我必须手动设置它.

COOKIES_ENABLED = False
COOKIES_DEBUG = True
Run Code Online (Sandbox Code Playgroud)

现在,我需要使用作为同一站点的响应接收的值来设置cookie.我能够得到如下的cookie,

cookie = response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试将其设置为表单请求

FormRequest.from_response(response,
                formdata={"username": "asldkfs", "pass": "slskd"},
                cookies={cookie[0]:cookie[1]},
                meta = {'dont_redirect': True,'handle_httpstatus_list': [302]},
                callback=self.redirection)

def redirection(self,response): 
    self.log("redirection")
    self.log(response.headers)               
    self.log("Cookie2")
    cook1 = response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")
    self.log(cook1)        
    self.log("end cookie2")
    return Request("http://something.net/some/sa/"+response.headers.getlist('Location')[0],cookies={cook1[0]:cook1[1]},
        callback=self.check_login_response)

.
.
.
Run Code Online (Sandbox Code Playgroud)

所以我无法设置cookie.我还需要设置任何其他值或可能是什么问题?

Pau*_*ira 9

cookie参数仅在COOKIES_ENABLED设置为True时才有效,因为CookiesMiddleware会处理它.

因此,您必须在标题上手动设置它:

cookie = response.headers.getlist('Set-Cookie')[0].split(';')[0]

FormRequest.from_response(response,
            formdata={"username": "asldkfs", "pass": "slskd"},
            headers={'Cookie': cookie}, # <---
            meta = {'dont_redirect': True,'handle_httpstatus_list': [302]},
            callback=self.redirection)
Run Code Online (Sandbox Code Playgroud)

  • 嘿我收到错误 `cookie = response.headers.getlist('Set-Cookie')[0].split(';')[0] TypeError: 需要类似字节的对象,而不是 'str'`\ (2认同)

小智 7

Paulo Romeira 的答案是正确的,只是缺少从字节到字符串的解析:

cookie = response.headers.getlist('Set-Cookie')[0].decode("utf-8").split(";")[0].split("=")
Run Code Online (Sandbox Code Playgroud)


小智 1

我认为如果您禁用它,您将无法使用 cookie。