在scrapy请求中删除cookie

use*_*508 5 cookies session-variables scrapy

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

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)
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,因为cookie很粘,以下所有请求都能很好地工作.我的报废很长,所以在某些时候cookie过期,所以我需要重新登录.此时我正在传递一个带回调登录功能的新请求.这里失败了,因为新的cookie与旧的cookie合并.有没有办法重置cookie?

回答

@Drewness在他的回答中建议dont_merge_cookies在元字典中使用属性.由于以下原因,它无法正常工作.根据源代码,以下请求:

Request(url=driver.current_url, cookies=self.driver.get_cookies(), callback=self.after_login, meta={'dont_merge_cookies' : True}, dont_filter=True)
Run Code Online (Sandbox Code Playgroud)

你传给他的饼干什么都不做.

在我的解决方案中,我决定跳过dont_merge_cookies属性,只需在创建请求之前重置响应头:

response.headers = {}
return Request(url=driver.current_url, cookies=self.driver.get_cookies(), callback=self.after_login, dont_filter=True)
Run Code Online (Sandbox Code Playgroud)

Dre*_*ess 2

来自文档

\n\n
\n

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

\n
\n\n

就像这样:

\n\n
request_with_cookies = Request(url="http://www.example.com",\n                               cookies={\'currency\': \'USD\', \'country\': \'UY\'},\n                               meta={\'dont_merge_cookies\': True})\n
Run Code Online (Sandbox Code Playgroud)\n\n

dont_merge_cookies当然是这里的关键。

\n