Python爬虫——selenium的相关操作

  • 1.定位元素
  • 2.操作表单元素
  • 3.行为链
  • 4.selenium页面等待
  • 4.1 Cookie操作
  • 4.2 页面等待
  • 5.打开多窗口和切换页面


1.定位元素

查找方式

方法名

id

find_element_by_id

类名

find_element_by_class_name

name属性

find_element_by_name

标签

find_element_by_tag_name

xpath语法

find_element_by_xpath

css选择器

find_element_by_css_selector

from selenium import webdriver

driver = webdriver.Chrome()
# 打开百度
driver.get('https://www.baidu.com/')

# 窗口最大化
driver.maximize_window()

# 定位元素
# find_element_by_id 根据id查找元素
# driver.find_element_by_id('kw').send_keys('哈')

# find_element_by_class_name 根据类名查找元素
# driver.find_element_by_class_name('s_ipt').send_keys('哈哈')

# find_element_by_name  根据name属性查找元素
# driver.find_element_by_name('wd').send_keys('哈哈哈')

# find_element_by_tag_name  根据标签名查找元素
# head = driver.find_element_by_tag_name('head')
# print(head)   # <selenium.webdriver.remote.webelement.WebElement (session="f7b4602f2105f3d4f6e2b32a7697a3bf", element="b2c778b0-2a24-46f8-84cb-d90e8fd12527")>

# find_element_by_xpath  根据xpath查找元素
# driver.find_element_by_xpath('//input[@id="kw"]').send_keys('哈哈哈哈')

# find_element_by_css_selector  根据css查找元素  其中.=class   #=id
# driver.find_element_by_css_selector('.s_ipt').send_keys('哈哈哈哈哈')

tips:find_element是查找一个元素,若要查找多个元素可以采用find_elements
例如:

InputTag = driver.find_elements_by_tag_name('input')
print(len(InputTag))  # 17

网页元素个数如下:

python 新版selenium4 取值 python selenium get_css

2.操作表单元素

以下示例效果展示采用的是百度、QQ邮箱以及中国气象网。

  • 操作输入框
    首先需要找到输入框,再使用send_keys填充数据,其中可以通过clear()进行清楚
InputBox = driver.find_element_by_id('kw')
InputBox.send_keys('输入框1')
time.sleep(2)
InputBox.clear()
InputBox.send_keys('输入框2')

  效果展示:

python 新版selenium4 取值 python selenium get_加载_02


两秒后,,,

python 新版selenium4 取值 python selenium get_css_03

  • 操作按钮
    按钮顾名思义需要通过点击进行触发,同样的进行操作时需要先选中,再进行点击操作即可。点击操作需要调用click()方法
"""..."""
SwitchBtn = driver.find_element_by_id("switcher_plogin")
SwitchBtn.click()

  效果展示(中间进行了iframe转换):

python 新版selenium4 取值 python selenium get_python_04

python 新版selenium4 取值 python selenium get_python_05

  • 操作checkbox
    和按钮类似,checkbox也需要通过点击进行触发,在进行操作时需要先选中,再进行点击操作
"""..."""
CheckBox = driver.find_element_by_id("q_low_login_enable")
# time.sleep(2)
CheckBox.click()

  效果展示(中间进行了iframe转换):

python 新版selenium4 取值 python selenium get_css_06

python 新版selenium4 取值 python selenium get_css_07

  • 操作select
    select的元素相对来说就复杂了一点,需要选中下拉框,再对下拉框中的元素进行点击操作。为此,selenium就专门为select标签提供了一个用于存储select选项的类——Select,使用时需要进行引入
"""..."""
from selenium.webdriver.support.ui import Select

# 找到下拉框
SelectTag = Select(driver.find_element_by_name("province"))

# 选择方式
# 1.根据值选择
# SelectTag.select_by_value('四川')
# 2.根据索引选择
SelectTag.select_by_index(1)

  效果展示:

python 新版selenium4 取值 python selenium get_输入框_08


python 新版selenium4 取值 python selenium get_加载_09


python 新版selenium4 取值 python selenium get_加载_10

3.行为链

当然,除了上面的基本操作,我们在页面中操作时往往需要进行很多步,这时就可以使用鼠标行为链ActionChains来完成。
使用时我们需要导入模块:

from selenium.webdriver.common.action_chains import ActionChains

常见方法如下:

方法名

作用

move_to_element()

移动鼠标到指定位置

send_keys_to_element()

对指定位置进行输入

context_click()

点击右键

click()

点击左键

perform()

提交行为链操作

click_and_hold()

点击不松鼠标

double_click()

双击

更多方法可以参考:http://selenium-python.readthedocs.io/api.html

4.selenium页面等待

4.1 Cookie操作

  • 获取所有cookie
cookies = driver.get_cookies()
  • 根据cookie的name获取cookie
value = driver.get_cookie('kw')
  • 删除某个cookie
driver.delete_cookie('kw')

4.2 页面等待

  • Ajax,是一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
  • 这种技术的出现,使得程序不能确定某个元素具体加载出来的时间。在实际网页中,如果在某元素未加载出来时就直接使用代码进行操作,就会导致程序报错。为了解决这种问题,selenium提供了两种等待方式:即隐式等待和显式等待
  • 隐式等待
    通过调用driver.implicitly_wait(),在获取不可用元素之前进行一段时间的等待
# 等待5秒钟
driver.implicitly_wait(5)
  • 显式等待
    在某条件成立后才执行获取元素的操作。也可以指定一个最大等待时间,若超过在这个时间就会抛出错误。
#显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

try:
    element = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID,"myDynamicElement"))
    )
finally:
    driver.quit()
    
# raise TimeoutException(message, screen, stacktrace)
  • 一些其他等待条件

方法名

作用

presence_of_element_located

某个元素加载完毕

presence_of_all_elements_located

网页中所有满足条件的元素都已加载完毕

element_to_be_clickable

某个元素是可以点击的

更多方法可以参考:http://selenium-python.readthedocs.io/waits.html

5.打开多窗口和切换页面

在实际中,我们常常需要打开多个页面而不是单独的一个进行操作。这种情况下就需要进行切换了,于是selenium又提供了一个叫做switch_to_window的方法来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

from selenium import webdriver

driver = webdriver.Chrome()
# 获取第一个页面
driver.get("https://www.baidu.com/")
# 再获取一个页面
driver.execute_script("window.open('https://mail.qq.com/')")
# 获取当前页面的url
print(driver.current_url)       #https://www.baidu.com/
# 切换到新的页面中
driver.switch_to.window(driver.window_handles[1])
# 获取当前页面的url
print(driver.current_url)       #https://mail.qq.com/