Python爬虫——5.selenium自动化测试工具和phantomjs无界面浏览器

一. selenium自动化测试工具

关于自动化测试: 在做自动化测试之前你需要知道的,http://www.cnblogs.com/fnng/p/3653793.html

1.什么是selenium和phantomjs?

selenium是一个web自动化测试工具,主要流行于web测试工程师的工作中

常规的web项目在开发完成后要对可用性进行测试,项目开发完成之后,通常是在浏览器中针对网页中的表单、链接等等可用性要进行手工测试,测试没有问题的项目才可以提交代码版本管理,最终通过完整测试之后,才能发布项目

web项目的测试可能会用到大量的网页操作[手工操作],针对某个项目的测试可能要频繁的进行多次测试[人力成本和物力成本较高->工作是重复的!],出现了自动化测试工具,将所有的人工操作的重复步骤通过代码的形式重现,在测试过程中只需要运行测试工具,就可以得到完整的测试报告!

selenium自动化测试工具应运而生!

在模式浏览器操作的过程中,selenium的充当了重要角色(用户),起到了至关重要作用(操作即测试)!

selenium针对浏览器的操作,要操作具体的浏览器,selenium又没有内置的浏览器,所以要通过操作其他浏览器来完成浏览器行为,出现了各种操作浏览器的api和专业测试使用的无界面浏览器phantomjs

常规情况下,通过直接操作谷歌、IE、火狐等浏览器内核可以直接完成对web项目的浏览器行为的测试[点击链接、填写表单、鼠标点击、鼠标拖拽等等],在这样的基础上有一个无界面浏览器Phantomjs可以完成所有浏览器内核的基础操作!

Phantomjs是一个无界面的浏览器,所以在操作效率上比其他的浏览器要更加的高效,用来进行基础功能测试是首选,通过基础功能测试之后,可以针对其他的浏览器特殊的兼容性问题单独测试

此时就可以开发一套基础测试代码用来测试任意浏览器通用的功能,开发独立的小模块代码测试不同的浏览器的兼容性问题!

2.爬虫为什么要使用selenium和phantomjs

数据具有一定的保密性,可以通过反爬虫操作,让数据不能被非法用户直接提取

但是~注意:我们服务器的数据,只要是正常用户可以访问的,就是通过请求可以提取到的数据,这里主要是对数据进行了高度的反爬虫操作[当数据的保密性达到一定程度时,反爬虫操作就会非常复杂]

此时:我们要考虑问题是~有没有可能花费对应的成本来破解对方的反爬虫

l 有条件:通过反反爬虫操作,破解对方服务器中的反爬虫措施,完成数据的采集,相对的~成本特别高!

l 没有成熟条件:通过正常请求直接获取数据[浏览器发起的请求!]直接通过selenium和phantomjs发起正常请求直接获取数据!

谷歌浏览器直接访问页面,右键保存源代码~~效率特别低

selenium+phantomjs可以通过编码的形式完成请求采集数据的要求~效率控制

3.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完成图形验证码的识别[正确率]
'''
 
 


你可能感兴趣的:(基础篇)