在与 Scrapy 进行身份验证的登录会话后使用 Selenium
Posted
技术标签:
【中文标题】在与 Scrapy 进行身份验证的登录会话后使用 Selenium【英文标题】:Using Selenium after authenticated login session with Scrapy 【发布时间】:2016-11-18 01:22:31 【问题描述】:环顾四周,似乎如果您通过 Scrapy 登录网站,如果您尝试在蜘蛛中使用 Selenium,则经过身份验证的登录会话不会转移。有没有办法将该会话转移到 Selenium?还是我必须使用 Selenium 重新登录网站?
谢谢!
【问题讨论】:
【参考方案1】:会话很可能只是您的 cookie。因此,要将会话转移到 Selenium webdriver,您需要将 scrapy 请求的 cookie 设置为 selenium。
Scrapy 足够聪明,可以自己跟踪 cookie,您可以在 response.headers
中找到当前请求的 cookie。
然后你可以为你的 webdriver 设置这些 cookie:
driver.add_cookie('name': 'foo', 'domain': 'bar')
您可以使用字典理解将response.headers['Set-Cookie']
转换为字典,例如:
import re
foo = response.headers['Set-Cookie']
values = k.strip():v for k,v in re.findall(r'(.*?)=(.*?);', foo)
driver.add_cookie(values)
注意:一些网站可以使用更复杂的会话,这些会话还需要其他标头匹配,但您也可以通过将您的 scrapy 响应标头复制到您的 selenium webdriver 来复制它。
【讨论】:
您好,非常感谢,我会试试看。但我是 python 新手,我对values = k.strip():v for k,v in re.findall(r'(.*?)=(.*?);', foo)
行有点困惑。您是否在行内定义函数?我只是想知道,这样我就可以查找我需要了解该行的任何相关教程。
这被称为dictionary comprehension,这是一种更高级的技术,但基本上它将字符串标题"cookie1=value1;cookie2=value"
转换为字典"cookie1":"value1","cookie2":"value2"
非常感谢。它最终没有工作,但无论如何谢谢!我只好用 selenium 手动重新登录,然后导航回原来的位置。【参考方案2】:
在scrapy selenium authentication也检查一个类似的问题
使用scrapy api登录
# call scrapy post request with after_login as callback
return FormRequest.from_response(
response,
# formxpath=formxpath,
formdata=formdata,
callback=self.browse_files
)
将会话传递给 selenium 驱动程序
# logged in previously with scrapy api
# partial solution
cookies = map(lambda e: e.strip(), cookie2.split(";"))
for cookie in cookies:
cookie_map = "name": name, "value": value
print "adding cookie"
print cookie_map
self.driver.add_cookie(cookie_map)
self.driver.get(response.url)
files = self.wait_for_elements_to_be_present(By.XPATH, "//*[@id='files']", response)
print files
【讨论】:
以上是关于在与 Scrapy 进行身份验证的登录会话后使用 Selenium的主要内容,如果未能解决你的问题,请参考以下文章
通过 Okta 进行身份验证后,会话 cookie 不会发送到 Spring Boot 应用程序
会话结束后从用户浏览器中删除 cookie。我使用 Passport-twitter 对用户进行身份验证。