Cookies 删除scrapy请求中的Cookie

Cookies 删除scrapy请求中的Cookie,cookies,scrapy,session-variables,Cookies,Scrapy,Session Variables,我正在使用scrapy+selenium,因为我正在废弃的网站需要javascript进行身份验证。我使用selenium登录,并将cookies传递给以下请求 def login(self, response): driver = webdriver.Firefox() driver.get("http://www.site.com/login") driver.find_element_by_xpath("//input[@id='myname']").send_ke

我正在使用scrapy+selenium,因为我正在废弃的网站需要javascript进行身份验证。我使用selenium登录,并将cookies传递给以下请求

def login(self, response):
    driver = webdriver.Firefox()
    driver.get("http://www.site.com/login")
    driver.find_element_by_xpath("//input[@id='myname']").send_keys(settings['USERNAME'])
    driver.find_element_by_xpath("//input[@id='mypwd']").send_keys(settings['PASSWORD'])
    driver.find_element_by_xpath("//input[@name='Logon']").click()
    self.driver = driver
    return Request(url=driver.current_url, cookies=self.driver.get_cookies(), callback=self.after_login, dont_filter=True)
到目前为止还不错,因为cookies是粘性的,所以下面所有的请求都能很好地工作。我的报废时间很长,所以Cookie会在某个时候过期,所以我需要重新登录。此时,我将向登录函数传递一个带有回调的新请求。这里它失败了,因为新的cookie与旧的cookie合并了。有没有办法重置cookies

回答

@德鲁内斯在回答中建议在元词典中使用
dont\u merge\u cookies
属性。由于以下原因,它不起作用。根据《公约》,提出以下要求:

Request(url=driver.current_url, cookies=self.driver.get_cookies(), callback=self.after_login, meta={'dont_merge_cookies' : True}, dont_filter=True)
对你传给他的饼干什么都不做

在我的解决方案中,我决定跳过
don\u merge\u cookies
属性,在创建请求之前简单地重置响应头:

response.headers = {}
return Request(url=driver.current_url, cookies=self.driver.get_cookies(), callback=self.after_login, dont_filter=True)
从:

当某些站点返回cookie(在响应中)时,这些cookie存储在 该域的cookies,并将在以后的请求中再次发送。 这是任何常规web浏览器的典型行为。但是如果,, 出于某种原因,您希望避免与您现有的cookie合并 可以指示Scrapy这样做

像这样:

request_with_cookies = Request(url="http://www.example.com",
                               cookies={'currency': 'USD', 'country': 'UY'},
                               meta={'dont_merge_cookies': True})

不要合并cookies
当然是这里的关键。

Hi@drowness,我已经根据你的建议编辑了原始帖子。我错过smthg了吗?