Python爬虫学习(十二)selenium来了
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的值中。
- Path
- ;C:\driver
然后验证不同的浏览器驱动是否正常使用:
selenium定位方法
Selenium提供了8种定位方式。
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
这8种定位方式在Python selenium中所对应的方法为:
- find_element_by_id()
- find_element_by_name()
- find_element_by_class_name()
- find_element_by_tag_name()
- find_element_by_link_text()
- find_element_by_partial_link_text()
- find_element_by_xpath()
- find_element_by_css_selector()
假如,我们需要定位上图输入框,可以通过以下代码实现:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id("kw")
至于其他的定位方法,写法类似。
点击和输入
学习了元素定位后,我们就可以进一步控制浏览器的行为了。比如:
- clear(): 清除文本。
- send_keys (value): 模拟键盘输入。
- click(): 单击元素。
假如我们需要在百度上搜索“白夜追凶”,我们不用自己打开浏览器,直接运行下面这段代码就行。
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)
- driver :浏览器驱动。
- timeout :最长超时时间,默认以秒为单位。
- poll_frequency :检测的间隔(步长)时间,默认为0.5S。
- ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
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/
以上。