Python中使用selenium(三)特殊操作

写在最前

本文中使用的driver对象为 driver = webdriver.Chrome() 获得的

如果对基本语法还不太了解建议看一下
Python中使用Selenium(一)环境安装
Python中使用selenium(二)基本语法

操作Cookie

在使用爬虫时,难免会遇到像登录验证码等问题,而有时候使用人工登录后,手动输入里面的Cookie可以直接免去登录的问题,也是曲线救国的方案

driver.get_cookies() 通过该方法可以获得cookie
driver.add_cookie(cookie) 通过该方法可以向浏览器中添加cookie

以下是向浏览器中添加cookie的实际代码
里面的cookies数组是之前录入的cookies数组,格式类似浏览器中的cookie
Python中使用selenium(三)特殊操作_第1张图片

# 拼接Cookie
for item in cookies :
    print(item)
    cookie= {}
    cookie['name']=item['name']
    cookie['value']=item['value']
    cookie['expires']=""
    cookie['path']="/"
    if item['name'] == "BZR_ID":
        cookie['path'] = "/pcenter"
    cookie['httpOnly']=False
    cookie['HostOnly']=False
    cookie['Secur']=False
    driver.add_cookie(cookie)

无头浏览器

无头浏览器就是没有界面的浏览器,可以更快的响应,减少渲染导致的卡顿
以及防止打印一些没有用的日志
例如 : ERROR:device_event_log_impl.cc(211)] [09:58:16.192] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: 连到系统上的设备没有发挥作用。 (0x1F)

option = webdriver.ChromeOptions()
# 隐藏窗口
option.add_argument('headless')
# 防止打印一些无用的日志
option.add_experimental_option("excludeSwitches", ['enable-automation','enable-logging'])
driver = webdriver.Chrome(chrome_options=option)

初始化一个非空浏览器

操作过程

在有些极端情况下,我们可能会调用chrome的插件,或者要使用用户数据,解决办法是将Chrome用户目录复制一份用于selenium使用,在代码中指定用户目录

  1. 首先我们需要找到我们的chrome用户目录,如果你没修改过目录的话,应该为以下的目录
C:\Users\{用户名}\AppData\Local\Google\Chrome\User Data
  1. 复制一份用户数据,例如我是这样的
C:\Users\11415\AppData\Local\Google\Chrome\User_Data_PY
  1. 在代码中指定新的用户目录
option = webdriver.ChromeOptions()
# 将Chrome的用户数据复制一份 TODO 配置Chrome用户目录
option.add_argument("--user-data-dir="+r"C:/Users/11415/AppData/Local/Google/Chrome/User_Data_PY/")
driver = webdriver.Chrome(chrome_options=option)

这样就可以启动的时候用户数据,以及原浏览器的插件都可以带过来了

关于里面的坑
指定用户目录后,一个用户目录只能打开一个Chrome,打开第二个时候会出错,目前是如果打开多个,再复制一份用户数据

selenium调用chrome插件功能

我在浏览器中初始化了一个chrome的视频加速插件,但是页面展示了#shadow-root元素,当时使用各种选择器都无法选中该插件
Python中使用selenium(三)特殊操作_第2张图片
解决办法
首先获取他的父元素,然后调用js将父元素传参过去来获得shadowsRoot元素

  fastDiv = driver.find_element_by_xpath("//div[@class='vsc-controller']")
  shadowRoot = driver.execute_script("return arguments[0].shadowRoot", fastDiv)

你可能感兴趣的:(爬虫,python,selenium,cookie)