selenium是一个web自动化测试工具,主要流行于web测试工程师的工作中 常规的web项目在开发完成后要对可用性进行测试,项目开发完成之后,通常是在浏览器中针对网页中的表单、链接等等可用性要进行手工测试,测试没有问题的项目才可以提交代码版本管理,最终通过完整测试之后,才能发布项目 web项目的测试可能会用到大量的网页操作[手工操作],针对某个项目的测试可能要频繁的进行多次测试[人力成本和物力成本较高->工作是重复的!],出现了自动化测试工具,将所有的人工操作的重复步骤通过代码的形式重现,在测试过程中只需要运行测试工具,就可以得到完整的测试报告! selenium自动化测试工具应运而生! 在模式浏览器操作的过程中,selenium的充当了重要角色(用户),起到了至关重要作用(操作即测试)! selenium针对浏览器的操作,要操作具体的浏览器,selenium又没有内置的浏览器,所以要通过操作其他浏览器来完成浏览器行为,出现了各种操作浏览器的api和专业测试使用的无界面浏览器phantomjs 常规情况下,通过直接操作谷歌、IE、火狐等浏览器内核可以直接完成对web项目的浏览器行为的测试[点击链接、填写表单、鼠标点击、鼠标拖拽等等],在这样的基础上有一个无界面浏览器Phantomjs可以完成所有浏览器内核的基础操作! Phantomjs是一个无界面的浏览器,所以在操作效率上比其他的浏览器要更加的高效,用来进行基础功能测试是首选,通过基础功能测试之后,可以针对其他的浏览器特殊的兼容性问题单独测试 此时就可以开发一套基础测试代码用来测试任意浏览器通用的功能,开发独立的小模块代码测试不同的浏览器的兼容性问题! |
数据具有一定的保密性,可以通过反爬虫操作,让数据不能被非法用户直接提取 但是~注意:我们服务器的数据,只要是正常用户可以访问的,就是通过请求可以提取到的数据,这里主要是对数据进行了高度的反爬虫操作[当数据的保密性达到一定程度时,反爬虫操作就会非常复杂] 此时:我们要考虑问题是~有没有可能花费对应的成本来破解对方的反爬虫 l 有条件:通过反反爬虫操作,破解对方服务器中的反爬虫措施,完成数据的采集,相对的~成本特别高! l 没有成熟条件:通过正常请求直接获取数据[浏览器发起的请求!]直接通过selenium和phantomjs发起正常请求直接获取数据! 谷歌浏览器直接访问页面,右键保存源代码~~效率特别低 selenium+phantomjs可以通过编码的形式完成请求采集数据的要求~效率控制 |
3-1. 安装selenium和Phantomjs安装selenium:pip install selenium 安装Phantomjs:~phantomjs不是python的模块,而是一个独立的软件,需要访问phantomjs官方网站进行下载,下载的压缩包解压之后~将phantomjs配置到系统环境变量中/或者将phantomjs存放在自己的项目中独立使用 3-2. selenium核心api① selenium.webdriver:核心驱动模块 # 启动无界面浏览器,若phantomjs.exe文件已经放置在python2文件夹下或者已经单独配置了环境变量(路径为..../phantomjs/bin,则可以直接启动无界面浏览器,若是直接将phantomjs压缩包解压后放置在项目中,则需要填写相对路径在driver = webdriver.PhantomJS()括号中) driver = webdriver.PhantomJS() # 启动谷歌浏览器内核,是否在括号填写路径,同上,这里采用谷歌浏览器 driver = webdriver.Chrom() # driver.get()打开浏览器的url地址 driver.get(“http://www.baidu.com”) ② 常用的元素查找 find_element_by_id(‘’) find_element_by_name(‘’) find_elements_by_name(‘’) find_elements_by_xpath(‘//input’) find_elements_by_link_text(‘精确查找’) find_elements_by_partial_link_text(“文本模糊查找”) find_elements_by_css_seletor(‘#box div’) find_elemnets_by_tag_name(‘div’) find_elements_by_class_name(‘box’) ③ 表单操作 直接在表单输入框中填写数据: driver.find_element_by_id(‘username’).send_keys(u’admin’) ④下拉列表框: from selenium.webdriver.support.ui import Select sl = Select(driver.find_element_by_id(‘city’)) sl.select_by_index(2) sl.select_by_value(‘zz’)# sl.select_by_visible_text(‘郑州’)# ⑤ 键盘按键: from selenium.webdriver.common.keys import Keys ..send_keys(Keys.CONTROL) # Ctrl ..send_keys(Keys.ALT)#Alt ..send_keys(Keys.NUMBER1) #1 ..send_keys(Keys.CONTROL, ‘a’) #Ctrl + a全选 ⑥ 鼠标操作 from selenium.webdriver import ActionChains su 有一个得到的标签 = driver.find_element_by_id(‘su’) ActionChains(driver).move_to_element(su).perform() ActionChains(driver).move_to_element(su).click(su).perform() .perform()表示执行操作 3-3. selenium操作百度搜索
# coding:utf-8
'''
使用selenium+phantomjs实现百度搜索
'''
# 引入自动化测试模块
from selenium import webdriver
import time
# 启动phantomjs无界面浏览器
browser=webdriver.PhantomJS()
#1. get方法打开url地址
browser.get('http://baidu.com/')
# 保存快照,确认已经打开浏览器
browser.save_screenshot('baidu1.png')
# 2.通过在与实际浏览器的配合,找到百度搜索框的id,通过id获取到该搜索框元素
sousuo=browser.find_element_by_id('kw')
# 获得到元素后,在该元素中输入要搜索的数据
sousuo.send_keys(u'火车票')
# 保存快照,确认输入无误
browser.save_screenshot('baidu2.png')
#3.通过在实际浏览器中查找,搜索id为su
su=browser.find_element_by_id('su')
# 4.点击
su.click()
time.sleep(2)
# 5.保存快照,查看搜索结果
browser.save_screenshot('baidu3.png')
即可看到网页数据已经获取,可以通过browser.page_source属性获取网页数据,便于筛选和保存。
3-4. selenium操作csdn登录# -*-coding:utf-8 -*-
'''
通过s+p登录csdn获取主页面数据
'''
# 引入自动化测试模块
from selenium import webdriver
import time
# 启动phantomjs无界面浏览器
browser=webdriver.PhantomJS()
# 打开csdn登录url
browser.get('https://passport.csdn.net/account/login?ref=toolbar')
# 查看屏幕快照,看是否正确打开
browser.save_screenshot('csdn1.png') # 获取账号和密码输入框的id,方便写入登录信息
browser.find_element_by_id('username').send_keys(u'******') # 登录名
browser.find_element_by_id('password').send_keys(u'******') # 登录密码
# 查看屏幕快照,确定正确输入
browser.save_screenshot('csdn2.png') # 获取登录按钮的id并点击
browser.find_element_by_css_selector('#fm1 .logging').click()
# 查看屏幕快照,查看获取到的页面
time.sleep(2)
browser.save_screenshot('csdn3.png') # 打印获取的信息
print browser.page_source
'''
1. 对于数据量并不是很大的常规数据采集,一般使用requests直接采集数据即可
2. 对于目标数据进行了非常复杂的反爬虫操作的网站,一般使用selenium+phantomjs进行数据采集
phantomjs:无界面浏览器,在操作过程中相对于其他浏览器操作效率较高!
3. 对于数据量较大的爬虫采集数据的行为,一般通过多线程或者多进程的方式以及scrapy框架和它分布式操作的方式采集数据
# 数据采集遇到的问题:
1) 目标网页发爬虫操作非常复杂,通过s+p完成数据采集:QQ空间个人中心页面
2) 目标网页是服务器直接渲染生成的HTML网页[包含数据]:智联招聘[django职位前5页数据采集->筛选工作岗位-薪水-公司]
3) 目标网页数据是通过Ajax方式在已经生成的网页上,使用DOM操作进行渲染的,服务器通过ajax地址返回的是json数据:内涵段子
通过p+s 完成这样的网页的数据采集[同样:selenium+phantomjs直接采集网页即可]
扩展:用tesseract完成图形验证码的识别[正确率]
'''
|
|