python 入门我用Python程序员

Python爬虫学习(十二)selenium来了

2017-09-19  本文已影响701人  弃用中

selenium 是一个web的自动化测试工具。简单的说就是一个可以用代码操所浏览器的工具,我我们可以通过selenium进行搜索关键字,点击按钮等等操作。

做个小小的演示



向毛主席保证,我只运行了一下那段代码!

下面对其进行介绍:

安装selenium

首先,在Windows命令提示符(cmd)/ Linux终端输入:

确保pip命令可用,如果提示pip不是内部或外部命令,需要将pip的安装目录(如:C:\Python36\Scripts)添加到环境变量PATH中。

接下来通过pip命令安装selenium:

安装完成后,打开一款Python编辑器,默认Python自带的IDLE也行。创建 baidu.py文件,输入以下内容:

如果执行出错,我们就要下载浏览器驱动。

下载浏览器驱动

当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。
各浏览器下载地址:
Firefox浏览器驱动:geckodriver
Chrome浏览器驱动:chromedriver
IE浏览器驱动:IEDriverServer
Edge浏览器驱动:MicrosoftWebDriver
Opera浏览器驱动:operadriver
PhantomJS浏览器驱动:phantomjs
注:部分浏览器驱动地址需要科学上网。

设置浏览器驱动

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。

我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:\driver”目录添加到Path的值中。

然后验证不同的浏览器驱动是否正常使用:

selenium定位方法

Selenium提供了8种定位方式。

这8种定位方式在Python selenium中所对应的方法为:

假如,我们需要定位上图输入框,可以通过以下代码实现:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id("kw")

至于其他的定位方法,写法类似。

点击和输入

学习了元素定位后,我们就可以进一步控制浏览器的行为了。比如:

假如我们需要在百度上搜索“白夜追凶”,我们不用自己打开浏览器,直接运行下面这段代码就行。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
kw = driver.find_element_by_id("kw")
kw.clear()
kw.send_keys('白夜追凶')
kw.click()

运行结果如下:

就是这么溜!

设置元素等待

元素等待有什么用呢?
比如,网速比较差的时候,可以让上面的搜索框加载出来了再去搜索。

webdriver提供了两种等待:显式等待和隐式等待。

显式等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

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.Firefox()
driver.get("http://www.baidu.com")

element = WebDriverWait(driver, 5, 0.5).until(
                      EC.presence_of_element_located((By.ID, "kw"))
                      )
element.send_keys('白夜追凶')
driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 until(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为True。until_not(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为False。
在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

隐式等待

WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单得多。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime

driver = webdriver.Firefox()

# 设置隐式等待为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

try:
    print(ctime())
    driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。

更多内容,请看:
http://www.seleniumhq.org/
http://www.testclass.net/selenium_python/

以上。

上一篇下一篇

猜你喜欢

热点阅读