设为首页 收藏本站
查看: 1328|回复: 0

[经验分享] python ghost.py使用笔记

[复制链接]

尚未签到

发表于 2015-11-30 09:53:28 | 显示全部楼层 |阅读模式
ghost.py目前已更新到0.2版本,变化有点大,使用方法上跟0.1还是有点差别的,本文仅以0.1.1版本为例,因为我安装的是这个版本
我用ghost主要用来模拟在网站上的操作,比如登录之类的,当然我也不懂别的用处。
首先,就像所有python模块的使用一样,都要先导入
import ghost

然后你可以使用dir方法查看ghost的一些方法属性等
DSC0000.png
我只用过Ghost这个类,别的就不说了,没用过
既然要操作网页,那么首先得打开浏览器
使用ghost模块就是先实例化一个浏览器对象,可能说法不太准确,不过自行理解吧
DSC0001.png
实例化的时候就用到了Ghost这个类,注意后面的那个空白小窗口,我在实例化的时候传入了display=True这个参数,于是这个窗口便会显示出来
,默认是不显示的,不过在调试程序的时候,显示出来还是挺方便的,程序调试完后,将参数去掉或改成False就可以了,不过在linux系统里无论display参数是什么,好像都是不显示的(我没试过带图形化的linux系统,有兴趣的可以试一下)
Ghost这个类在实例化的时候可以传入很多参数
具体可以参见ghost的源码或者使用help方法查看,如下
DSC0002.png
简单解释一下我所知道的参数的作用
user_agent  这个是浏览器头部,作用就不解释了,请自行百度
wait_timeout  超时参数,有些网页加载很慢,这个超时会显示加载时间,当加载时间超出后,就不在等待页面加载,而继续执行下一段代码
wait_callback  没用过。。
log_level  日志级别
display  前面已经演示了
viewport_size  窗口大小,默认窗口大小是800*600,不过这个可以自己设置,例如
DSC0003.png
download_images  是否加载网页上的图片,有时候为了提高网页的加载速度或别的目的,需要禁止图片的加载
好了,别的参数没用过
实例化完之后,我们就有了一个浏览器对象,名字就是gh(我的习惯)
然后利用dir查看gh的方法和属性
DSC0004.png
最基本的方法就是open了
DSC0005.png
顾名思义,该方法的作用是打开一个网页或别的什么页面,利用help我们可以看到他的参数
好吧,貌似这么多参数,我只用过一个,就是address了
比如打开百度
DSC0006.png
代码如上,然后我们可以看到下图,
DSC0007.png
不过当上面的代码执行完之后,浏览器窗口是不可以使用鼠标或键盘操作的
,会进入一种很像卡死的状态,未响应,不过如果想操作这个窗口,也是有办法的,如下
DSC0008.png
sleep方法可以传入秒数,在指定时间内让这个窗口保持活动状态,但同时也能组织代码向下继续运行
但在这10秒内,我们就可已把这个窗口当作一个真正的浏览器来进行操作,虽然这个浏览器没那么多的功能吧

当然,我们的目的是用代码来操作这个浏览器,因此这个sleep也没什么用,我主要用他来等待页面加载
在打开百度的时候,代码如下


我使用了两个变量来接受open方法的返回值,在ghost这个模块里,大部分方法,只要涉及到页面加载的都会放回两个值
具体返回什么可以在ghost的源码里看到
以open方法为例,对抓包有所了解,或者写过网站的人,都知道在打开一个网页时,会加载很多的资源,不是仅仅加载当前这个主页面就够了
在ghost里,每个被加载过来的资源都是一个HttpResource对象,下图是源码中这个对象的部分
DSC0009.png
通过dir,我们可以知道这个HttpResource对象的基本方法,不细说了,差不多也能看出来这些方法都是什么意思
DSC00010.png
那么page就是加载的主页面的资源对象,resources则是其他资源对象的列表
那么ghost是怎么区分谁是主页面呢,其实很简单
源码如下
DSC00011.png
哈哈,是不是很简单,不知道的时候我还以为多么高大上呢
其实这个HttpResource对象,我用到的方法只有url,content,url用来确定是不是我想要的资源,content用来获取资源的内容

在打开一个页面时,可能会出现超时,超时的情况下,ghost会抛出一个异常TimeoutError,请注意捕获
DSC00012.png

下面进入正题,打开一个页面后,我们需要用代码去操作这个页面,因此ghost模块提供了很多的方法
我就一个一个解释一下我会使用的吧
还是以百度为例
show()
DSC00013.png
该方法用来显示浏览器窗口

hide()
DSC00014.png
该方法用来隐藏浏览器窗口
sleep()
不解释了
DSC00015.png

exit()
该方法用于销毁当前实例,相当于关闭浏览器
DSC00016.png
DSC00017.png

exists()
DSC00018.png
DSC00019.png
exists方法接收一个参数selector,这个selector是css选择器,ghost使用选择器来操作页面上的对象,不懂什么是选择器的,请自行百度
上例中的selector 是 "#su" ,这个选择器指向了百度页面上那个百度一下按钮
exists方法用于判断当前页面是否存在传入的选择器,存在返回True,不存在返回False,
这个方法在判断页面加载是否完成、或者页面是否是预期页面时很有用。

click()
源码如下
DSC00020.png
DSC00021.png
第一个参数为选择器,后面的参数是装饰器@can_load_page赋予的,所有被这个装饰器装饰的函数都可以添加这个参数,
click函数模拟鼠标左键点击作用,点击对象由selector确定,expect_loading参数用于告诉浏览器页面是否需要加载,
因为不是所有的点击都需要加载页面的。
我们可以在需要加载的时候将其设为True,不需要加载的时候可以不传,默认为False,因为页面加载是会消耗时间的
同样需要注意的是,凡是需要加载页面的时候都要捕获TimeoutError异常,因为超时是很常见的

fire()
有时候我们需要出发页面上某个对象的效果,但又不是click,就要用到fire方法了
selector为对象的选择器,event为要触发的事件名字
例如下图,就是实现click的另一种方式
DSC00022.png
DSC00023.png

set_field_value()
DSC00024.png
该方法源码比较长,就不上全图了
作用就是向指定选择器中添加数据
value即为添加的数据,字符转类型的,
blur我就不解释了,没用过,没看出来有什么作用,应该当光标进入会引发一些事件的时候才有用,一般情况下默认就行
DSC00025.png
DSC00026.png

fill()
用于向表单中添加数据,内部调用了set_field_value方法,其实也可以直接使用set_field_value方法,只不过fill比较方便

selector参数指向一个form表单,
values参数为字典类型
    key是form中某个input的name值
    value是你要填写的值
DSC00027.png
DSC00028.png

如果你注意了的话,会发现上面的方法其实貌似最后都是执行的js语句
如果你是js高手的话,你完全可以用js去实现上面的功能,以及上面没有的功能,那么直接执行js的方法就是
evaluate()
参数script为一段js代码
返回值为js执行后的返回值(没有返回值就是None)和执行过程中产生的资源对象列表(open方法中的第二个返回值)
DSC00029.png
evaluate_js_file()
从指定文件中读取js代码并执行,参数就不解释了
DSC00030.png


wait_for()
condition参数是一个判断函数
当condition()返回为True时,wait_for函数才停止工作,
timeout_message参数为当超时后抛出的异常信息
timeout参数设置超时时间
后面有好几个函数会调用这个函数去实现一些常用的功能
DSC00031.png

wait_for_alert()
等待页面加载直到有alert动作
DSC00032.png
wait_for_page_loaded()
等待页面完全加载成功
DSC00033.png
wait_for_selector()
等待页面加载直到指定选择器出现
DSC00034.png
wait_while_selector()
等待页面加载直到指定选择器消失
DSC00035.png
wait_for_text()
等待页面加载直到指定文本出现
DSC00036.png


下面说一下截图
region_for_selector()
此函数根据selector返回此选择器的一个同时包含左上和右下坐标的元组
DSC00037.png

capture()
此函数用来根据指定的条件截取网页上的某部分,不指定任何条件的话就截取整个网页
DSC00038.png
参数region 是一个元组,将需要截取的区域的左上角(x1,y1)和右下角(x2,y2)的坐标整合在一起(x1,y1,x2,y2)
例如
DSC00039.png
DSC00040.png
参数selector是选择器,ghost会根据选择器的范围进行截图
其实就是算选择器的坐标,然后再根据坐标截图
DSC00041.png
DSC00042.png
region的优先级大于selector
DSC00043.png
有时候使用选择器可能不会把我们想截取的部分全部选中,这时就要用到region了


capture_to()
其实就是调用capture()方法并save(),使用capture_to()方便一些,不用save了
DSC00044.png

下面说一下cookie的处理
cookies
返回包含所有cookie的一个列表 DSC00045.png
delete_cookies()
清除所有cookie
DSC00046.png

load_cookies()
参数cookie_storage 为CookieJar对象或文件名,当为文件名时,cookie信息会从指定文件里加载
参数keep_old为是否保留已经存在的cookie
DSC00047.png
save_cookies()
参数cookie_storage 为CookieJar对象或文件名,当为文件名时,cookie信息会保存到指定文件
DSC00048.png

当然你也可以直接操作gh.cookie_jar这样你就可以更灵活的使用,毕竟真正封装好的方法只是最基本的,常用的,不能面对一些特殊的需求的,
当需要做一些现有方法无法实现的功能时,最好研究下源码,看内部是怎么实现的,这样解决问题的路子就会变的很宽了


还有代理,差点忘了
set_proxy()
使用方法如下
参数type_ 代理类型,常见的有http,https
参数host  代理ip地址
参数port  代理端口
DSC00049.png
去掉代理时使用如下方法,也就是添加一个默认的代理



一些小技巧:
1,禁止图片加载
    在实例化的时候我们可以禁止图片的加载,不过我们可能需要打开多个页面,有些页面是需要加载图片的,有些是不需要的,但实例化的时候写死了怎么办呢
如下

download_images参数是实例化的时候传入的,在源码中ghost是如上图所示去使用的,那么当你碰到需要下载图片的时候就可以这么干

不下载的时候把True改成False就行
注意的是参数更改后立刻生效,所以要判断好什么时候改下载,什么时候不下载
上图中有个异常    name 'QtWebKit' is not defined
因为我们是直接导入的ghost,当前作用域里并没有QtWebKit这个东西,那么这个东西在哪里呢,看源码



我安装的是PySide,因此我可以这么做就可以了

如果你要用到这个技巧的话,可以把   from PySide import QtWebKit 放在脚本最开始处

2,如果你对dom模型熟悉的话,你可以直接操作当前的gh,main_frame从中获取所需要的数据,而不是利用正则从page.content.data()中获取数据


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145216-1-1.html 上篇帖子: 萤火虫算法-python实现 下篇帖子: 深入Python模块的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表