Python爬虫——selenium的相关操作

1.定位元素

查找方式方法名
idfind_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

网页元素个数如下:
在这里插入图片描述

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')

  效果展示:
在这里插入图片描述
两秒后,,,
在这里插入图片描述

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

  效果展示(中间进行了iframe转换):
在这里插入图片描述在这里插入图片描述

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

  效果展示(中间进行了iframe转换):
在这里插入图片描述在这里插入图片描述

  • 操作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)

  效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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/
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值