详解Selenium+PhantomJS+python简单实现爬虫的功能


Posted in Python onJuly 14, 2019

Selenium

一、简介

selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样

selenium2支持通过驱动真实浏览器(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)

selenium2支持通过驱动无界面浏览器(HtmlUnit,PhantomJs)

二、安装

Windows

第一种方法是:下载源码安装,下载地址(https://pypi.python.org/pypi/selenium)解压并把整个目录放到C:\Python27\Lib\site-packages下面

第二种方法是:可以直接在C:\Python27\Scripts 下输入命令安装 pip install -U selenium

sudo pip install selenium

PhantomJS

一、简介

PhantomJS 是一个基于 WebKit(WebKit是一个开源的浏览器引擎,Chrome,Safari就是用的这个浏览器引擎) 的服务器端 JavaScript API,主要应用场景是:无需浏览器的 Web 测试,页面访问自动化,屏幕捕获,网络监控

二、安装

Windows

下载源码安装,下载地址(http://phantomjs.org/download.html)解压并把解压缩的路径添加到环境变量中即可,我自己的放到了C:\Python27\Scripts 下面

Linux

sudo apt-get install PhantomJS

Selenium + PhantomJS + python 简单实现爬虫的功能

python可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如PhantomJS在后台执行。
在工作用遇到一个问题,当加载一个手机端的URL时候,会加载不上,需要我们在请求头中设置一个User-Agent,设置完以后就可以打开了(Windows下执行,linux下执行的话就不用加executable_path='C:\Python27\Scripts\phantomjs.exe')

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 
dcap = dict(DesiredCapabilities.PHANTOMJS) #设置userAgent
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ")
 
obj = webdriver.PhantomJS(executable_path='C:\Python27\Scripts\phantomjs.exe',desired_capabilities=dcap) #加载网址
obj.get('http://wap.95533pc.com')#打开网址
obj.save_screenshot("1.png") #截图保存
obj.quit() # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS,因为会有多个PhantomJS在运行状态,影响电脑性能

一、超时设置

webdriver类中有三个和时间相关的方法:

1.pageLoadTimeout    设置页面完全加载的超时时间,完全加载即完全渲染完成,同步和异步脚本都执行完
2.setScriptTimeout    设置异步脚本的超时时间
3.implicitlyWait         识别对象的智能等待时间

下面我们以获取校花网title为例来验证效果,因为校花网中图片比较多,所以加载的时间比较长,更能时间我们的效果(另一原因我就不说了,这样才能让我们学起来带劲,哈哈!!!)

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
try:
 obj.get('http://www.xiaohuar.com')
 print obj.title
except Exception as e:
 print e

二、元素的定位

对象的定位是通过属性定位来实现的,这种属性就像人的身份证信息一样,或是其他的一些信息来找到这个对象,那我们下面就介绍下Webdriver提供的几个常用的定位方法

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

上面这个是百度的输入框,我们可以发现我们可以用id来定位这个标签,然后就可以进行后面的操作了

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
try:
 obj.get('http://www.baidu.com')
 obj.find_element_by_id('kw')     #通过ID定位
 obj.find_element_by_class_name('s_ipt')   #通过class属性定位
 obj.find_element_by_name('wd')     #通过标签name属性定位
 obj.find_element_by_tag_name('input')   #通过标签属性定位
 obj.find_element_by_css_selector('#kw')   #通过css方式定位
 obj.find_element_by_xpath("//input[@id='kw']") #通过xpath方式定位
 obj.find_element_by_link_text("贴吧")   #通过xpath方式定位
 
 print obj.find_element_by_id('kw').tag_name #获取标签的类型
except Exception as e:
 print e

 三、浏览器的操作

1、调用启动的浏览器不是全屏的,有时候会影响我们的某些操作,所以我们可以设置全屏

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
obj.maximize_window() #设置全屏
try:
 obj.get('http://www.baidu.com')
 obj.save_screenshot('11.png') # 截取全屏,并保存
except Exception as e:
 print e

2、设置浏览器宽、高

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
obj.set_window_size('480','800') #设置浏览器宽480,高800
try:
 obj.get('http://www.baidu.com')
 obj.save_screenshot('12.png') # 截取全屏,并保存
except Exception as e:
 print e

3、操作浏览器前进、后退

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
try:
 obj.get('http://www.baidu.com') #访问百度首页
 obj.save_screenshot('1.png')
 obj.get('http://www.sina.com.cn') #访问新浪首页
 obj.save_screenshot('2.png')
 obj.back()       #回退到百度首页
 obj.save_screenshot('3.png')
 obj.forward()      #前进到新浪首页
 obj.save_screenshot('4.png')
except Exception as e:
 print e

四、操作测试对象

定位到元素以后,我们就应该对相应的对象进行某些操作,以达到我们某些特定的目的,那我们下面就介绍下Webdriver提供的几个常用的操作方法

from selenium import webdriver
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
try:
 obj.get('http://www.baidu.com')
 print obj.find_element_by_id("cp").text # 获取元素的文本信息
 obj.find_element_by_id('kw').clear()    #用于清除输入框的内容
 obj.find_element_by_id('kw').send_keys('Hello') #在输入框内输入Hello
 obj.find_element_by_id('su').click()    #用于点击按钮
 obj.find_element_by_id('su').submit()    #用于提交表单内容
 
except Exception as e:
 print e

五、键盘事件

1、键盘按键用法

from selenium.webdriver.common.keys import Keys
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
try:
 obj.get('http://www.baidu.com')
 obj.find_element_by_id('kw').send_keys(Keys.TAB) #用于清除输入框的内容,相当于clear()
 obj.find_element_by_id('kw').send_keys('Hello') #在输入框内输入Hello
 obj.find_element_by_id('su').send_keys(Keys.ENTER) #通过定位按钮,通过enter(回车)代替click()
 
except Exception as e:
 print e

2、键盘组合键使用

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
obj.set_page_load_timeout(5)
try:
 obj.get('http://www.baidu.com')
 obj.find_element_by_id('kw').send_keys(Keys.TAB) #用于清除输入框的内容,相当于clear()
 obj.find_element_by_id('kw').send_keys('Hello') #在输入框内输入Hello
 obj.find_element_by_id('kw').send_keys(Keys.CONTROL,'a') #ctrl + a 全选输入框内容
 obj.find_element_by_id('kw').send_keys(Keys.CONTROL,'x') #ctrl + x 剪切输入框内容
 
except Exception as e:
 print e

六、中文乱码问题

selenium2 在python的send_keys()中输入中文会报错,其实在中文前面加一个u变成unicode就能搞定了

七、鼠标事件

1、鼠标右击

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
try:
 obj.get("http://pan.baidu.com")
 obj.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('13201392325') #定位并输入用户名
 obj.find_element_by_id('TANGRAM__PSP_4__password').send_keys('18399565576lu') #定位并输入密码
 obj.find_element_by_id('TANGRAM__PSP_4__submit').submit()      #提交表单内容
 f = obj.find_element_by_xpath('/html/body/div/div[2]/div[2]/....')    #定位到要点击的标签
 ActionChains(obj).context_click(f).perform()          #对定位到的元素进行右键点击操作
 
except Exception as e:
 print e

2、鼠标双击 

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
obj = webdriver.PhantomJS(executable_path="D:\Python27\Scripts\phantomjs.exe")
try:
 obj.get("http://pan.baidu.com")
 obj.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('13201392325') #定位并输入用户名
 obj.find_element_by_id('TANGRAM__PSP_4__password').send_keys('18399565576lu') #定位并输入密码
 obj.find_element_by_id('TANGRAM__PSP_4__submit').submit()      #提交表单内容
 f = obj.find_element_by_xpath('/html/body/div/div[2]/div[2]/....')    #定位到要点击的标签
 ActionChains(obj).double_click(f).perform()          #对定位到的元素进行双击操作
 
except Exception as e:
 print e

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python删除字符串中指定字符的方法
Aug 13 Python
python搜索包的路径的实现方法
Jul 19 Python
如何利用python给图片添加半透明水印
Sep 06 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
详解Python中namedtuple的使用
Apr 27 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
对python中list的五种查找方法说明
Jul 13 Python
Python 串口通信的实现
Sep 29 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 Python
python3中apply函数和lambda函数的使用详解
Feb 28 Python
python基于Selenium的web自动化框架
Jul 14 #Python
Django项目使用CircleCI的方法示例
Jul 14 #Python
Python实现最常见加密方式详解
Jul 13 #Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 #Python
简单了解python反射机制的一些知识
Jul 13 #Python
Python3内置模块之base64编解码方法详解
Jul 13 #Python
Python3enumrate和range对比及示例详解
Jul 13 #Python
You might like
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
keras中的backend.clip用法
2020/05/22 Python
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
六五普法规划实施方案
2014/03/21 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
教师演讲稿大全
2014/05/16 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
会计试用期自我评价
2014/09/19 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
入党申请书格式
2019/06/20 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android