学习爬虫第八天 selenium
1. Selenium
1-1 .介绍
介绍:
selenium是⼀个web的⾃动化测试⼯具,最初是为⽹站⾃动化测试⽽开发的,selenium可以直接运⾏在浏览器上,它⽀持所有主流的浏览器,可以接收指令,让浏览器⾃动加载⻚⾯,获取需要的数据,甚⾄⻚⾯截屏.
常见浏览器与其driver:
- Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
- Firefox:
https://github.com/mozilla/geckodriver/releases - Edge:
https://developer.microsoft.com/en-us/microsoft- edge/tools/webdriver/ - Safari:
https://webkit.org/blog/6900/webdriver-support-in-safari-10/
1-2. 安装
库安装: pip install selenium
driver通用安装方法:
- 官网下载驱动zip文件
- 解压压缩包
- 剪贴.exe文件
- 找到Python安装文件夹目录
- 粘贴到python同级目录下
2. Selenium 使用
2-1. 简单使用案例:
常规使用:
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()
不显示浏览器(浏览器静默)使用:
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('headless')
# 实例化浏览器
driver = webdriver.Chrome(chrome_option=option)
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()
2-2. 定位元素
2-2-1. 根据id来查找某个元素
根据id来查找某个元素: find_element_by_id
使用示例:
submitTag = driver.find_element_by_id('su') # 方法1
submitTag = driver.find_element(By.ID,'su') # 方法2
2-2-2. 根据类名查找元素
根据类名查找元素: find_element_by_class_name
使用示例:
submitTag = driver.find_element_by_class_name('su') # 方法1
submitTag1 = driver.find_element(By.CLASS_NAME,'su') # 方法2
2-2-3. 根据name属性的值来查找元素
根据name属性的值来查找元素: find_element_by_name
使用示例:
submitTag = driver.find_element_by_name('email') # 方法1
submitTag1 = driver.find_element(By.NAME,'email') # 方法2
2-2-4. 根据标签名来查找元素
根据标签名来查找元素: find_element_by_tag_name
使用示例:
submitTag = driver.find_element_by_tag_name('div') # 方法1
submitTag1 = driver.find_element(By.TAG_NAME,'div') # 方法 2
2-2-5. 根据xpath语法来获取元素
根据xpath语法来获取元素: find_element_by_xpath
使用示例:
submitTag = driver.find_element_by_xpath('//div') # 方法1
submitTag1 = driver.find_element(By.XPATH,'//div') # 方法2
2-2-6. 根据css选择器选择元素
根据css选择器选择元素: find_element_by_css_selector
使用示例:
submitTag = driver.find_element_by_css_selector('//div') # 方法1
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div') # 方法2
2-2-7. 备注:
find_element 是获取第⼀个满⾜条件的元素。find_elements 是获取所有满⾜条件的元素
2-3. 操作表单元素
2-3-1. 操作步骤:
- 找到这个元素
- 使用send_keys(value),将数据填充出去
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
2-3-2. 其它常用方法
- clear方法可以清楚输入框中的内容
inputTag.clear()
- 操作checkbox:
步骤:- 选中checkbox标签
- 执行click事件
rememberTag = driver.find_element_by_name("rememberMe") # 选中标签
rememberTag.click() # 执行事件
- 操作按钮: click()
inputTag = driver.find_element_by_id('su') 2 inputTag.click()
-
选择select:
备注:select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专⻔为select标签提供了⼀个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类 中,创建这个对象。以后就可以使⽤这个对象进⾏选择了。
2-4. 行为链(不常用)
2-4-1. 介绍:
介绍:
有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件。
2-4-2. 常用方法
常用方法:
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)actions.context_click()
actions.click(submitTag)
actions.perform()
更多鼠标点击操作:
- click_and_hold(element):点击但不松开⿏标。
- context_click(element):右键点击。
- double_click(element):双击。
- 更多⽅法请参考:
http://selenium-python.readthedocs.io/api.html
2-5. Cookie操作
2-5-1. 获取所有的cookie
cookies = driver.get_cookies()
2-5-2. 根据cookie的name获取cookie
value = driver.get_cookie(key)
2-5-3. 删除某个cookie
driver.delete_cookie('key')
2-6. 页面等待
2-6-1. 介绍
介绍: 现在的⽹⻚越来越多采⽤了Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际⻚⾯等待时间过⻓导致某个dom元素还没出来,但是你的代码直接使⽤了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以Selenium 提供了两种等待⽅式:⼀种是隐式等待、⼀种是显式等待。
2-6-2. 隐式等待
介绍: 调⽤driver.implicitly_wait。那么在获取不可⽤的元素之前,会先等待10秒中的时间。
使用方法:
driver.implicitly_wait(10)
2-6-3. 显示等待
介绍:
显示等待是表明某个条件成⽴后才执⾏获取元素的操作。也可 以在等待的时候指定⼀个最⼤的时间,如果超过这个时间那么就抛出⼀个异常。显示等待应该使⽤
selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成。
使用示例:
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()
2-6-4. 一些其他的等待条件
- presence_of_element_located:某个元素已经加载完毕了。
- presence_of_all_elements_located:⽹⻚中所有满⾜条件的元素都加载完毕了。
- element_to_be_clickable:某个元素是可以点击了。
更多条件请参考:
http://selenium-python.readthedocs.io/waits.html
2-7. 打开窗口和切换页面
介绍:
有时候窗⼝中有很多⼦tab⻚⾯。这时候肯定是需要进⾏切换的。selenium提供了⼀个叫做switch_to_window来进⾏切换,具体切换到哪个⻚⾯,可以从driver.window_handles中找到。
使用示例:
# 打开⼀个新的⻚⾯
driver.execute_script("window.open('url')")
print(driver.current_url)
# 切换到这个新的⻚⾯中
driver.switch_to_window(self.driver.window_handles[1])
3. phantomjs 工具 (即将淘汰)
3-1. phantomjs 介绍
Phantomjs介绍: Phantomjs是⼀个基于webkit的"⽆界⾯"浏览器,它会把⽹站加载到内存并执⾏⻚⾯上的JavaScript
3-2. phantomjs 安装
下载地址: https://npm.taobao.org/
安装方法:
- 官网下载驱动zip文件
- 解压压缩包
- 剪贴.exe文件
- 找到Python安装文件夹目录
- 粘贴到python同级目录下
3-3. Phantomjs 简单使用
案例示例:
# 1. 加载网页
from selenium import webdriver
driver = webdriver.PhantomJS("安装目录") (python目录下,无需指定)
driver.get("https://www.baidu.com")
driver.save_screenshot("baidu.png") # 截图
# 2. 定位和操作
driver.find_element_by_id("kw").send_keys("长城") # 找到输入框并输入"长城"
driver.find_element_by_id("su").click() # 点击 百度一下
# 3. 查看请求信息
driver.page_source() # 获取页面信息
driver.get_cookies() # 获取cookie
driver.current_url() # 获取当前url
# 4. 退出
driver.quit()
4. chromedriver 工具
4-1. 介绍:
介绍:
chromedriver是⼀个驱动Chrome浏览器的驱动程序,使⽤他才可以驱动浏览 器。当然针对不同的浏览器有不同的driver。
4-2. chromedriver 安装
下载chromedriver:
’chromedriver’ executable needs to be in PATH`报错解决:
https://www.jianshu.com/p/a383e8970135