详解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利用正则表达式排除集合中字符的功能示例
Oct 10 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
基于python实现名片管理系统
Nov 30 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
基于python3生成标签云代码解析
Feb 18 Python
python中如何进行连乘计算
May 28 Python
区分python中的进程与线程
Aug 13 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 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中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
php实现微信支付之退款功能
2018/05/30 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python实现的系统实用log类实例
2015/06/30 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
python中的变量如何开辟内存
2018/06/26 Python
一行python实现树形结构的方法
2019/08/09 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
详解Scrapy Redis入门实战
2020/11/18 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
init进程的作用
2012/04/12 面试题
销售人员个人求职信
2013/09/26 职场文书
捐书寄语赠言
2014/01/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
初中学生期末评语
2014/04/24 职场文书
经典导游欢迎词
2015/01/26 职场文书
六一儿童节开幕词
2015/01/29 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang