Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get cookie from scrapy response and set the cookie to the next request?

I have disabled the Default Scrapy cookie option, so that i have to set it manually.

COOKIES_ENABLED = False
COOKIES_DEBUG = True

Now, i need to set cookie with the value which is received as the response of the same site. I can able to get the cookie as below,

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

now i am trying to set it to the form request by

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)

.
.
.

So I could not set the cookie.Do i need to set any other value also or what could be the problem?

like image 786
Manikandan Arunachalam Avatar asked Apr 06 '16 06:04

Manikandan Arunachalam


4 Answers

The cookies argument only works if you have COOKIES_ENABLED set to True, since CookiesMiddleware handles it.

Hence you have to set it manually on the headers:

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)
like image 96
Paulo Romeira Avatar answered Nov 19 '22 04:11

Paulo Romeira


The answer from Paulo Romeira is correct, only the parsing from byte to string is missing:

cookie = response.headers.getlist('Set-Cookie')[0].decode("utf-8").split(";")[0].split("=")
like image 24
Mirko Avatar answered Nov 19 '22 05:11

Mirko


I think you could not work with cookies if you disabled it.

like image 29
Verz1Lka Avatar answered Nov 19 '22 05:11

Verz1Lka


You can also use the concepts of creating cookiejars and handling the cookies there (for maintaining sessions in scrapy) using the following strategies documented here in the official scrapy docs: https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#std:reqmeta-cookiejar

Also refer this stackoverflow issue: Scrapy - how to manage cookies/sessions

like image 38
dhruv sharma Avatar answered Nov 19 '22 04:11

dhruv sharma