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)
来自文档:
\n\n\n\n\n当某些站点返回 cookie(在响应中)时,这些 cookie 将存储在该域的 cookie 中,并将在将来的请求中再次发送。\n 这是任何常规 Web 浏览器的典型行为。但是,如果出于某种原因您希望避免与现有 cookie 合并,您可以指示 Scrapy 这样做。
\n
就像这样:
\n\nrequest_with_cookies = Request(url="http://www.example.com",\n cookies={\'currency\': \'USD\', \'country\': \'UY\'},\n meta={\'dont_merge_cookies\': True})\nRun Code Online (Sandbox Code Playgroud)\n\ndont_merge_cookies当然是这里的关键。
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |