详解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 os模块介绍
Nov 30 Python
Python实现自动发送邮件功能
Mar 02 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
python操作oracle的完整教程分享
Jan 30 Python
python 字典中取值的两种方法小结
Aug 02 Python
Django开发的简易留言板案例详解
Dec 04 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
Django 源码WSGI剖析过程详解
Aug 05 Python
python基础教程之while循环
Aug 14 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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防注入及开发安全详细解析
2013/08/09 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
js获取ip和地区
2017/03/10 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
python并发和异步编程实例
2018/11/15 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
银行实习的自我鉴定
2013/12/10 职场文书
学校七一活动方案
2014/01/19 职场文书
简历中的自我评价范文
2014/02/05 职场文书
交通处罚决定书
2015/06/24 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
python tkinter实现定时关机
2021/04/21 Python
Django显示可视化图表的实践
2021/05/10 Python
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js