在与 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的主要内容,如果未能解决你的问题,请参考以下文章

使用cookies进行身份验证登录

通过 Okta 进行身份验证后,会话 cookie 不会发送到 Spring Boot 应用程序

会话结束后从用户浏览器中删除 cookie。我使用 Passport-twitter 对用户进行身份验证。

ADLDAP openLDAP 身份验证 - 未存储会话 - 返回登录页面

通过 PHP 会话进行服务器身份验证

在 JAVA 中通过身份验证后如何获取 okta 用户详细信息/当前会话