Python爬虫04: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()
Selenium的基本操作
下面介绍Selenium库的基本操作,具体内容请参考Selenium官方文档.
创建浏览器句柄
下面三种方式都可以创建浏览器句柄.
-
若chromedriver已被添加到路径,则可直接调用
Chrome
类的构造函数.from selenium import webdriver driver = webdriver.Chrome()
-
若chromedriver没有被添加到路径,则调用
Chrome
类的构造函数需要指定该驱动文件所在路径.from selenium import webdriver driver = webdriver.Chrome(executable_path='/home/user/chromedirver')
-
要使用无界面模式启动浏览器,则需要向构造函数传入一个
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()
方法对当前窗口进行截图.
控制浏览器
-
访问网址
driver.get('https://www.baidu.com')
-
控制浏览器的前进后退
driver.refersh() # 刷新页面 driver.forward() # 前进页面 driver.back() # 后退页面
-
退出浏览器
driver.quit() # 关闭浏览器窗口并销毁driver对象
-
获取页面的状态
driver.current_url # 返回 页面的URL driver.page_source # 返回 页面源码 driver.get_cookie('BAIDUID') # 返回 指定名字的cookies driver.get_cookies() # 返回 所有cookies的列表
-
执行javascript代码
# 同步执行js代码 driver.execute('window.scrollTo(0, document.body.scrollHeight)') # 异步执行js代码 driver.execute_async_script('send_xml_request()')
通过执行js代码将页面拉至指定位置,可以防止由于懒加载导致查询不到元素的问题
-
等待页面元素
在使用
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
等.
-
-
截图
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
对象存在如下属性和方法,可以对页面元素进行操作
-
查找子元素:
与
WebDriver
完全相同,WebElement
有一系列find_xxx()
方法,用来在子元素中查找元素. -
查询元素状态:
-
查询元素的文本内容
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}
-
-
操作元素:
-
点击元素
web_element.click()
-
向可写入元素发送键盘事件
from selenium.webdriver.common.keys import Keys # 导入特殊键 input_web_element.send_keys('keys') # 写入字符串'keys' input_web_element.send_keys(Keys.RETURN) # 写入回车键
-