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
网页元素个数如下:
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/