库介绍
Selenium是一个强大的网络数据采集工具(http://www.seleniumhq.org/),最初是为网站自动化测试而开发,同时也它们也可以运行在浏览器上。在Python中应用功能主要如下:
- 让浏览器自动加载页面
- 获取浏览器网页加载的数据
- 页面截屏
- 判断网站上某些动作是否发生
项目环境
操作系统:win10
python版本:3.6
解析器:pycharm2018
Selenium文档:
使用流程
一、下载并安装selenium库
1、通过PyPI网站(https://pypi.python.org/simple/selenium/)下载
2、通过三方管理器pip下载:
$ pip install selenium
二、下载第三方浏览器驱动
Selenium自己不带浏览器,需要与第三方浏览器结合使用。
1、通过PhantomJS让程序在后台运行(下载地址:http://phantomjs.org/download.html)它会把网页加载到内存并执行页面上的JavaScript,但不会展示网页的图形界面。可以处理cookie,JavaScript,header等,现在Selenium库已经不支持PhantomJS。
2、选择在浏览器Chrome/Firefox上运行Selenium:
需要下载chromedriver.exe(http://chromedriver.storage.googleapis.com/index.html)
版本参照表:http://npm.taobao.org/mirrors/chromedriver/2.41/notes.txt
三、案例
(一)Ajax网页测试
from selenium import webdriver
import time
# 用浏览器运行selenium,需要将下载的chromedriver.exe保存在对应python工程下或指定其他地址
driver = webdriver.Chrome() # chromedriver这里放在工程目录下
# 打开网页
driver.get('http://pythonscraping.com/pages/javascript/ajaxDemo.html')
# Ajax测试,由于测试网页有ajax加载2秒,所以这里暂停执行3秒
time.sleep(3)
print(driver.find_element_by_id('content').text)
# 关闭网页
driver.close()
(二)检测网页加载成功后再执行
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
# 创建webdriver
driver = webdriver.Chrome()
# 打开网页
driver.get('http://pythonscraping.com/pages/javascript/ajaxDemo.html')
# 检测网页执行。是否出现某个元素后执行
try:
# driver等待10秒,直到网页出现元素标签ID名为loadedButton
elements = WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator=(By.ID, 'loadedButton')))
finally:
# 抓取content元素中的文本
print(driver.find_element_by_id('content').text)
# 关闭网页
driver.close()
说明:
- 一般通过WebDriverWait类和expected_conditions类来实现隐式的等待。
- locator定位器对象,用来定位网页元素
- 一般定位:ID/CLASS_NAME/CSS_SELECTOR/LINK_TEXT/PARTIAL_LINK_TEXT/NAME/TAG_NAME/XPATH
(三)处理重定向
from selenium import webdriver
import time
from selenium.common.exceptions import StaleElementReferenceException
def waitForLoad(driver):
elem = driver.find_element_by_tag_name('html')
count = 0
while True:
count += 1
if count > 20:
print('Timing out after 10 seconds and returning')
return
time.sleep(.5)
try:
elem == driver.find_element_by_tag_name('html')
except StaleElementReferenceException as e:
print(e)
return
# 创建webdriver
driver = webdriver.Chrome()
# 打开网页
driver.get('http://pythonscraping.com/pages/javascript/redirectDemo1.html')
# 检测网页执行。是否出现某个元素后执行
try:
waitForLoad(driver)
finally:
print(driver.page_source)
# 关闭网页
driver.close()
说明:可以通过异常类StaleElementReferenceException,来实现监控网页变化的效果。当driver无法捕捉到html元素标签,则触发异常,等同于网页已经实现重定向。