Python爬虫04:Selenium库

Selenium环境的安装

  • 浏览器驱动的安装
  • 安装Selenium库
  • 启动浏览器窗口
  • Selenium的基本操作
  • 创建浏览器句柄
  • 控制浏览器
  • 查找元素
  • 操作页面元素

Selenium环境的安装

浏览器驱动的安装

要想使用Selenium驱动浏览器,就要先安装对应版本的浏览器驱动.对于Chrome浏览器,其驱动的下载位置为https://sites.google.com/a/chromium.org/chromedriver/home.

下载好驱动后,我们要将驱动所在位置加入到系统路径PATH中.

安装Selenium库

使用pip install selenium即可安装selenium.

启动浏览器窗口

创建selenium.webdriver的Chrome对象,即可开启一个浏览器窗口,并返回一个句柄用以操作该浏览器.

from selenium import webdriver
driver = webdriver.Chrome()

python怎么使用selenium框架 python中selenium库_Selenium

Selenium的基本操作

下面介绍Selenium库的基本操作,具体内容请参考Selenium官方文档.

创建浏览器句柄

下面三种方式都可以创建浏览器句柄.

  1. 若chromedriver已被添加到路径,则可直接调用Chrome类的构造函数.
from selenium import webdriver
driver = webdriver.Chrome()
  1. 若chromedriver没有被添加到路径,则调用Chrome类的构造函数需要指定该驱动文件所在路径.
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/user/chromedirver')
  1. 要使用无界面模式启动浏览器,则需要向构造函数传入一个Option参数指定以无界面模式启动
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

option = Options()
option.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=option)

以无界面模式启动浏览器时,不会显示浏览器窗口.可以使用driver对象的save_screenshot()方法对当前窗口进行截图.

控制浏览器

  1. 访问网址
driver.get('https://www.baidu.com')
  1. 控制浏览器的前进后退
driver.refersh()	# 刷新页面
driver.forward()	# 前进页面
driver.back()		# 后退页面
  1. 退出浏览器
driver.quit()		# 关闭浏览器窗口并销毁driver对象
  1. 获取页面的状态
driver.current_url	# 返回 页面的URL
driver.page_source	# 返回 页面源码

driver.get_cookie('BAIDUID')	# 返回 指定名字的cookies
driver.get_cookies()			# 返回 所有cookies的列表
  1. 执行javascript代码
# 同步执行js代码
driver.execute('window.scrollTo(0, document.body.scrollHeight)')	

# 异步执行js代码
driver.execute_async_script('send_xml_request()')

通过执行js代码将页面拉至指定位置,可以防止由于懒加载导致查询不到元素的问题

  1. 等待页面元素在使用WebDriver的find_xxx方法找不到某元素时会报错,而这可能与网速有关.因此,在查询元素的时候,应尽量使用等待.
  • 隐式等待: 阻塞指定时间(单位为秒)直到下一个查找语句得到结果.若超过阻塞时间仍得不到指定元素则报错.
driver.implicityly_wait(10)		# 阻塞最多10秒以得到下个查找语句的结果
  • 显式等待: 阻塞指定时间(单位为秒)直到查询结果满足指定条件.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 阻塞最多10秒直到driver句柄查到的结果存在
sort_btn = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, './/div[@class="f-sort"]/a[2]'))
)

expected_conditions包内定义了很多见名知义的条件,常用的有presence_of_element_located,element_to_be_clickable,element_to_be_selected,presence_of_all_elements_located等.

  1. 截图
driver.save_screenshot('./screenshot/image1.png')	# 截图到文件./screenshot/image1.png中

查找元素

浏览器句柄WebDriver对象有18个以find_xxx开头的方法,可以根据返回值的类型分为两类.find_element_by_xxx()方法返回以WebElement对象的形式返回第一个匹配的页面元素,find_elements_by_xxx()方法以WebElement列表的形式返回所有匹配的页面元素对象.

方法

查询条件

find_element_by_class_name()

find_element_by_class_name()

根据节点的类名查找

find_element_by_id()

find_element_by_id()

根据节点的id查找

find_element_by_name()

find_element_by_name()

根据节点的name属性查找

find_element_by_tag_name()

find_element_by_tag_name()

根据节点的标签名查找

find_element_by_link_text()

find_element_by_link_text()

根据链接的文本查找

find_element_by_partial_link_text()

find_element_by_partial_link_text()

根据链接的文本进行模糊查找

find_element_by_css_selector()

find_element_by_css_selector()

根据CSS选择器语法查找

find_element_by_xpath()

find_element_by_xpath()

根据XPath语法查找

操作页面元素

页面元素WebElement对象存在如下属性和方法,可以对页面元素进行操作

  1. 查找子元素:与WebDriver完全相同,WebElement有一系列find_xxx()方法,用来在子元素中查找元素.
  2. 查询元素状态:
  • 查询元素的文本内容
web_element.text
  • 查询元素的属性
web_element.get_attribute('id')

web_element.get_attribute('href')
  • 查询元素的CSS属性
web_element.value_of_css_property('height')
  • 查询元素的坐标
web_element.rect		# 得到 {'height': 220, 'width': 220, 'x': 200, 'y': 628}
web_element.location	# 得到 {'x': 200, 'y': 628}
  1. 操作元素:
  • 点击元素
web_element.click()
  • 向可写入元素发送键盘事件
from selenium.webdriver.common.keys import Keys	# 导入特殊键 

input_web_element.send_keys('keys')				# 写入字符串'keys'
input_web_element.send_keys(Keys.RETURN)		# 写入回车键