Python 爬虫类库 Selenium 的常用方法介绍

Selenium 简介

Selenium 是一个 Web 的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是 Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括 PhantomJS 这些无界面的浏览器)。
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。
先下载 selenium webdriver geckodriver.exe,下载好后放到 python 目录里面。
Firefox 的目录也要添加到环境变量中。
Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互(发送文本、点击等),以及执行其他动作来运行网络爬虫。

Selenium 快速入门

# -*- coding:utf-8 -*-
from selenium import webdriver
# 要想调用键盘按键操作需要引入 keys 包
from selenium.webdriver.common.keys import Keys

# 创建浏览器对象
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

# 打印页面标题“百度一下你就知道”
print(driver.title)

# 生成当前页面快照
driver.save_screenshot("baidu.png")

# 是百度搜索框,输入字符串“微博”,跳转到搜索页面
driver.find_element_by_id("kw").send_keys(u"微博")

# 是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()

# 获取新的页面快照
driver.save_screenshot(u"screenshot.png")

# 打印网页渲染后的源代码
print(driver.page_source)

# 获取当前页面 Cookie
print(driver.get_cookies())

# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("test")

# 模拟 Enter 回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)

# 清除输入框内容
driver.find_element_by_id("kw").clear()

# 生成新的页面快照
driver.save_screenshot("test.png")

# 获取当前 url
print(driver.current_url)

# 关闭当前页面,如果只有一个页面,会关闭浏览器
driver.close()

# 关闭浏览器
driver.quit()
1、页面操作

假如有下面的输入框:

<input type="text" name="user-name" id="passwd-id" />

查找方法如下:

# 获取 id 标签值
element = driver.find_element_by_id("passwd-id")
# 获取 name 标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过 XPath 来匹配
element = driver.find_element_by_xpath("//input[@]")
2、定位元素
# 通过 Id 定位目标元素
driver.find_element_by_id('i1')
 
# 通过 className 定位目标元素,返回一个对象
driver.find_element_by_class_name('c1')
 
# 通过 name 属性定位目标元素,返回一个对象
driver.find_element_by_name('n1')
 
# 通过 Xpath 定位目标元素,返回一个对象
driver.find_element_by_xpath('//*[@id="i1"]')
 
# 通过 css Selector 定位目标元素,返回一个对象
driver.find_element_by_css_selector('#i1')
 
# 通过标签名称定位,返回一个对象
driver.find_element_by_tag_name('input')
 
# 通过标签中的文本查找元素,返回一个对象
driver.find_element_by_link_text('登录')

一次查找多个元素(这些方法会返回一个 list 列表):

# 通过 className 定位目标元素,返回一个集合
driver.find_elements_by_class_name('c1')
 
# 通过 name 属性定位目标元素,返回一个集合
driver.find_elements_by_name('n1')
 
# 通过 Xpath 定位目标元素,返回一个集合
driver.find_elements_by_xpath('//*[@id="i1"]')
 
# 通过 Css Selector 定位目标元素,返回一个集合
driver.find_elements_by_css_selector('#i1')
 
# 通过标签名称定位,返回一个集合
driver.find_elements_by_tag_name('input')
 
# 通过标签中的文本查找元素,返回一个集合
driver.find_element_by_link_text('登录')

# 通过标签中文本的模糊匹配查找,返回一个集合
find_elements_by_partial_link_text("订单")
3、鼠标动作
# -*- coding:utf-8 -*-
from selenium import webdriver
# 要想调用键盘按键操作需要引入 keys 包
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
# 创建浏览器对象
driver = webdriver.Firefox()
# 打开页面
driver.get("http://www.baidu.com")
# 鼠标移动到某处
action1 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action1).perform()
# 鼠标移动到某处单击
action2 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action2).click(action2).perform()
# 鼠标移动到某处双击
action3 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action3).double_click(action3).perform()
# 鼠标移动到某处右击
action4 = driver.find_element_by_id("su")
ActionChains(driver).move_to_element(action4).context_click(action4).perform()
4、Select 表单
# 导入 Select 类
from selenium.webdriver.support.ui import Select

# 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))

select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"xxx")

以上是三种选择下拉框的方式,它可以根据索引来选择,可以根据值来选择,可以根据文字来选择。注意:

index 索引从 0 开始
value 是 option 标签的一个属性值,并不是显示在下拉框中的值
visible_text 是在 option 标签文本的值,是显示在下拉框的值

全部取消方法

select.deselect_all()
5、弹窗处理

当页面出现了弹窗提示:

alert = driver.switch_to_alert()
6、页面切换

一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:

driver.switch_to.window("this is window name")
7、页面前进和后退
driver.forward()     #前进
driver.back()        # 后退

8、模拟登陆豆瓣网站

# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Firefox()
driver.get("http://www.douban.com")
# 输入账号密码
driver.find_element_by_name("form_email").send_keys("158xxxxxxxx")
driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx")
# 模拟点击登录
driver.find_element_by_xpath("//input[@]").click()
# 等待3秒
time.sleep(3)
# 生成登陆后快照
driver.save_screenshot(u"douban.png")
driver.quit()

以上就是 Selenium 的一些常用方法。

posted @ 2012-04-17 16:15  Charles Zhang  阅读(4720)  评论(0编辑  收藏  举报