ghost.py目前已更新到0.2版本,变化有点大,使用方法上跟0.1还是有点差别的,本文仅以0.1.1版本为例,因为我安装的是这个版本
我用ghost主要用来模拟在网站上的操作,比如登录之类的,当然我也不懂别的用处。
首先,就像所有python模块的使用一样,都要先导入
import ghost
然后你可以使用dir方法查看ghost的一些方法属性等
我只用过Ghost这个类,别的就不说了,没用过
既然要操作网页,那么首先得打开浏览器
使用ghost模块就是先实例化一个浏览器对象,可能说法不太准确,不过自行理解吧
实例化的时候就用到了Ghost这个类,注意后面的那个空白小窗口,我在实例化的时候传入了display=True这个参数,于是这个窗口便会显示出来
,默认是不显示的,不过在调试程序的时候,显示出来还是挺方便的,程序调试完后,将参数去掉或改成False就可以了,不过在linux系统里无论display参数是什么,好像都是不显示的(我没试过带图形化的linux系统,有兴趣的可以试一下)
Ghost这个类在实例化的时候可以传入很多参数
具体可以参见ghost的源码或者使用help方法查看,如下
简单解释一下我所知道的参数的作用
user_agent 这个是浏览器头部,作用就不解释了,请自行百度
wait_timeout 超时参数,有些网页加载很慢,这个超时会显示加载时间,当加载时间超出后,就不在等待页面加载,而继续执行下一段代码
wait_callback 没用过。。
log_level 日志级别
display 前面已经演示了
viewport_size 窗口大小,默认窗口大小是800*600,不过这个可以自己设置,例如
download_images 是否加载网页上的图片,有时候为了提高网页的加载速度或别的目的,需要禁止图片的加载
好了,别的参数没用过
实例化完之后,我们就有了一个浏览器对象,名字就是gh(我的习惯)
然后利用dir查看gh的方法和属性
最基本的方法就是open了
顾名思义,该方法的作用是打开一个网页或别的什么页面,利用help我们可以看到他的参数
好吧,貌似这么多参数,我只用过一个,就是address了
比如打开百度
代码如上,然后我们可以看到下图,
不过当上面的代码执行完之后,浏览器窗口是不可以使用鼠标或键盘操作的
,会进入一种很像卡死的状态,未响应,不过如果想操作这个窗口,也是有办法的,如下
sleep方法可以传入秒数,在指定时间内让这个窗口保持活动状态,但同时也能组织代码向下继续运行
但在这10秒内,我们就可已把这个窗口当作一个真正的浏览器来进行操作,虽然这个浏览器没那么多的功能吧
当然,我们的目的是用代码来操作这个浏览器,因此这个sleep也没什么用,我主要用他来等待页面加载
在打开百度的时候,代码如下
我使用了两个变量来接受open方法的返回值,在ghost这个模块里,大部分方法,只要涉及到页面加载的都会放回两个值
具体返回什么可以在ghost的源码里看到
以open方法为例,对抓包有所了解,或者写过网站的人,都知道在打开一个网页时,会加载很多的资源,不是仅仅加载当前这个主页面就够了
在ghost里,每个被加载过来的资源都是一个HttpResource对象,下图是源码中这个对象的部分
通过dir,我们可以知道这个HttpResource对象的基本方法,不细说了,差不多也能看出来这些方法都是什么意思
那么page就是加载的主页面的资源对象,resources则是其他资源对象的列表
那么ghost是怎么区分谁是主页面呢,其实很简单
源码如下
哈哈,是不是很简单,不知道的时候我还以为多么高大上呢
其实这个HttpResource对象,我用到的方法只有url,content,url用来确定是不是我想要的资源,content用来获取资源的内容
在打开一个页面时,可能会出现超时,超时的情况下,ghost会抛出一个异常TimeoutError,请注意捕获
下面进入正题,打开一个页面后,我们需要用代码去操作这个页面,因此ghost模块提供了很多的方法
我就一个一个解释一下我会使用的吧
还是以百度为例
show()
该方法用来显示浏览器窗口
hide()
该方法用来隐藏浏览器窗口
sleep()
不解释了
exit()
该方法用于销毁当前实例,相当于关闭浏览器
exists()
exists方法接收一个参数selector,这个selector是css选择器,ghost使用选择器来操作页面上的对象,不懂什么是选择器的,请自行百度
上例中的selector 是 "#su" ,这个选择器指向了百度页面上那个百度一下按钮
exists方法用于判断当前页面是否存在传入的选择器,存在返回True,不存在返回False,
这个方法在判断页面加载是否完成、或者页面是否是预期页面时很有用。
click()
源码如下
第一个参数为选择器,后面的参数是装饰器@can_load_page赋予的,所有被这个装饰器装饰的函数都可以添加这个参数,
click函数模拟鼠标左键点击作用,点击对象由selector确定,expect_loading参数用于告诉浏览器页面是否需要加载,
因为不是所有的点击都需要加载页面的。
我们可以在需要加载的时候将其设为True,不需要加载的时候可以不传,默认为False,因为页面加载是会消耗时间的
同样需要注意的是,凡是需要加载页面的时候都要捕获TimeoutError异常,因为超时是很常见的
fire()
有时候我们需要出发页面上某个对象的效果,但又不是click,就要用到fire方法了
selector为对象的选择器,event为要触发的事件名字
例如下图,就是实现click的另一种方式
set_field_value()
该方法源码比较长,就不上全图了
作用就是向指定选择器中添加数据
value即为添加的数据,字符转类型的,
blur我就不解释了,没用过,没看出来有什么作用,应该当光标进入会引发一些事件的时候才有用,一般情况下默认就行
fill()
用于向表单中添加数据,内部调用了set_field_value方法,其实也可以直接使用set_field_value方法,只不过fill比较方便
selector参数指向一个form表单,
values参数为字典类型
key是form中某个input的name值
value是你要填写的值
如果你注意了的话,会发现上面的方法其实貌似最后都是执行的js语句
如果你是js高手的话,你完全可以用js去实现上面的功能,以及上面没有的功能,那么直接执行js的方法就是
evaluate()
参数script为一段js代码
返回值为js执行后的返回值(没有返回值就是None)和执行过程中产生的资源对象列表(open方法中的第二个返回值)
evaluate_js_file()
从指定文件中读取js代码并执行,参数就不解释了
wait_for()
condition参数是一个判断函数
当condition()返回为True时,wait_for函数才停止工作,
timeout_message参数为当超时后抛出的异常信息
timeout参数设置超时时间
后面有好几个函数会调用这个函数去实现一些常用的功能
wait_for_alert()
等待页面加载直到有alert动作
wait_for_page_loaded()
等待页面完全加载成功
wait_for_selector()
等待页面加载直到指定选择器出现
wait_while_selector()
等待页面加载直到指定选择器消失
wait_for_text()
等待页面加载直到指定文本出现
下面说一下截图
region_for_selector()
此函数根据selector返回此选择器的一个同时包含左上和右下坐标的元组
capture()
此函数用来根据指定的条件截取网页上的某部分,不指定任何条件的话就截取整个网页
参数region 是一个元组,将需要截取的区域的左上角(x1,y1)和右下角(x2,y2)的坐标整合在一起(x1,y1,x2,y2)
例如
参数selector是选择器,ghost会根据选择器的范围进行截图
其实就是算选择器的坐标,然后再根据坐标截图
region的优先级大于selector
有时候使用选择器可能不会把我们想截取的部分全部选中,这时就要用到region了
capture_to()
其实就是调用capture()方法并save(),使用capture_to()方便一些,不用save了
下面说一下cookie的处理
cookies
返回包含所有cookie的一个列表
delete_cookies()
清除所有cookie
load_cookies()
参数cookie_storage 为CookieJar对象或文件名,当为文件名时,cookie信息会从指定文件里加载
参数keep_old为是否保留已经存在的cookie
save_cookies()
参数cookie_storage 为CookieJar对象或文件名,当为文件名时,cookie信息会保存到指定文件
当然你也可以直接操作gh.cookie_jar这样你就可以更灵活的使用,毕竟真正封装好的方法只是最基本的,常用的,不能面对一些特殊的需求的,
当需要做一些现有方法无法实现的功能时,最好研究下源码,看内部是怎么实现的,这样解决问题的路子就会变的很宽了
还有代理,差点忘了
set_proxy()
使用方法如下
参数type_ 代理类型,常见的有http,https
参数host 代理ip地址
参数port 代理端口
去掉代理时使用如下方法,也就是添加一个默认的代理
一些小技巧:
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