爬虫selenium:selenium基本操作

1-Selenium简介:Selenium是一个用于web自动化测试的工具,Selenium测试直接运行在浏览器中,就好像一个真正的用户在操作一样, 支持大部分主流的浏览器,包括IE(7,8,9,10,11),Firefox,Safari,Chrome,Opera等。

我们可以利用它来模拟用户点击访问网站,绕过一些复杂的认证场景
通过selnium+驱动浏览器这种组合可以直接渲染解析js,绕过大部分的参数构造和反爬。
注意事项:
新版本的Selenium已经不在支持phantomjs,原作者也已经放弃维护该项目了。
还有在做爬虫的时候尽量不要用这种方法,Selenium+浏览器的组合速度慢,应付不了数据量比较大的爬取以及并发爬取。并且很吃电脑资源。

2-Selenium配置

Selenium安装非常简单,直接pip就可以搞定: pip install selenium
使用selenium驱动chrome浏览器需要下载chromedriver,而且chromedriver版本需要与chrome的版本对应,版本错误的话则会运行报错。

Chromedriver下载地址:https://chromedriver.storage.googleapis.com/index.html

Windows: 下载对应版本的chromedriver解压后,将文件移动到一个配置了环境变量的文件夹中,例如Python安装文件夹

Linux/Mac: 解压后,将文件移动至/usr/local/bin目录中

3-基本使用

1-元素选取
在一个页面中有很多不同的策略可以定位一个元素。我们可以选择最合适的方法去查找元素。Selenium提供了下列的方法:
在这里插入图片描述
除了以上的多种查找方式,还有两种私有方法集成了上面的所有的查找方法,让我们更方便的使用
在这里插入图片描述
其中的第一个参数可以选择使用查找的方法,By.xxx 使用xxx方式解析,解析方法如下:
注:By对象导入: from selenium.webdriver.common.by import By
D = “id”
XPATH = “xpath”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
CSS_SELECTOR = “css selector”

4-窗口/页面/弹窗切换

1-窗口切换
用selenium操作浏览器如果需要在打开新的页面,这个时候会有问题,因为我们用selenium操作的是第一个打开的窗口,所以新打开的页面我们是无法去操作的,所以我们要用到切换窗口:既handle切换的方法
在这里插入图片描述
*Window_handles的顺序并不是浏览器上标签的顺序
尽量避免多标签操作

5-页面(frame)切换

在实际的爬虫中,,明明定位的路径没问题,这个时候我们可以考虑一下是否是该页面存在frame的问题导有时候我们会遇到找不到元素的问题致的定位不到元素。
在这里插入图片描述

6-页面弹窗

有的时候还会遇到弹窗的问题, 主要有两种一种是浏览器弹窗(alert/prompt),一种是自定义弹窗
自定义弹窗,就是一个自定义的div层,是隐藏页面中的,当触发了这个弹窗后,他就显示出来,这种方式我们通过正常的定位方式是可以定位到的。

alert弹窗,就要用下面的方法处理
在这里插入图片描述

7-等待/动作链

1-等待:在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后,才会将操作权限在交给我们的程序。
但是,由于ajax和各种JS代码的异步加载问题,当一个页面被加载到浏览器时,该页面内的元素可以在不同的时间点被加载,这就使得元素的定位变得十分困难,当元素不再页面中时,使用selenium去查找的时候会抛出ElementNotVisibleException异常。
为了解决这个问题,selenium提供了两种等待页面加载的方式,显示等待和隐式等待,让我们可以等待元素加载完成后在进行操作。
显示等待:显式等待指定某个条件,然后设置最长等待时间,程序每隔XX时间看一眼,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常(TimeoutException)。
显示等待主要使用了WebDriverWait类与expected_conditions模块。
一般写法:WebDriverWait(driver, timeout, poll_frequency, igonred_exceptions).until(method, message)

Driver:传入WebDriver实例。
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用until中的方法的间隔时间,默认是0.5秒
ignored_exceptions: 忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待.

Method:可执行方法
Message: 超时时返回的信息

WebDriverWait包:from selenium.webdriver.support.wait import WebDriverWait
expected_conditions包:from selenium.webdriver.support import expected_conditions as EC

expected_conditions条件:expected_conditions是selenium的一个子模块,其中包含一系列可用于判断的条件,配合该类的方法,就能够根据条件而进行灵活地等待了
在这里插入图片描述

显示等待:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://baidu.com')
locator = (By.LINK_TEXT, '贴吧')

try:
    WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
    print(driver.find_element_by_link_text('贴吧').get_attribute('href'))
finally:
    driver.close()


隐式等待:隐性等待implicitly_wait(xx) :设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

弊端就是程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待。,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,

隐性等待对整个driver的周期都起作用,所以只要设置一次即可
隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
默认等待时间为0,可以通过下面的方式设置:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)        #隐式等待,最长10s
driver.get('https://www.baidu.com')

8-动作链(ActionChains)

在selenium当中除了简单的点击动作外,还有一些稍微复杂的动作,就需要用到ActionChains(动作链)这个子模块来满足我们的需求。
ActionChains可以完成复杂一点的页面交互行为,例如元素的拖拽,鼠标移动,悬停行为,内容菜单交互。
它的执行原理就是当调用ActionChains方法的时候不会立即执行,而是将所有的操作暂时储存在一个队列中,当调用perform()方法的时候,会按照队列中放入的先后顺序执行前面的操作。
在这里插入图片描述
在这里插入图片描述

from selenium import webdriver
from selenium.webdriver.common.action_chains  import ActionChains
import time

driver = webdriver.Chrome()
try:
    driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')
    time.sleep(2)
    element = driver.find_element_by_id('treeDemo_2_span')
    target = driver.find_element_by_id('treeDemo_3_span')
    ActionChains(driver).drag_and_drop(element, target).perform()
    time.sleep(5)
finally:
    driver.quit()

猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104500216