2020/04/09 03-模拟登陆和页面等待
试试是否能模拟键盘
这个是登录要用到的地址
现在借助selenium和phantomjs来搞定,这里id肯定也是不可重复的
form表单里面根本不关心是div还是table,下回提交,只要控件有name就带上数据
send_keys就是找id这个元素然后往里面送入键盘key,也就是模拟键盘输入
先输入账号密码试一下
现在就看到输入的账号密码了
敲回车需要引入一个特殊键
特殊键ENTER,然后再看当前的url
第三幅图就对了
你用session访问没有办法解决登录的问题,那时登录没办法模拟,现在可以把验证码的图片拿到,然后可以input把验证码输入进去。
但是如果是有鼠标滑块,那个基本没有好的解决方案
现在登录成功应该有cookie,看看是否能拿到
拿到cookie后,使命就完成了,就可以把这个cookie传给requests写好的爬虫,为了防止别人封你,你的爬取速度要控制下
先拿一次cookie
因为跳转需要时间,或者去判断右上角出来退出按钮没有
有了这个OSCid就成
中间不需要的可以注释
现在已经是免登陆的cookie了
这个cookie带上之后让它访问登录页不登录了说明就成功了,现在就是想不用session,每次就用保存好的cookie往上传
登录首页如果打的cookie是ok的就直接跳转了
上面是浏览器,下面是全部用库来实现了
这里也打印一下地址
上面是不带cookie的,下面试试带上cookie的、
request函数这里有个cookies参数,放字典或者喝是cookieJar,有的时候可以用cookiejar来做
找到快速向导
推荐使用下面这种方式
set就是kv,等于写字典了
列表遍历就是一个个字典
可以把里面的值拿出来,直接写jar.set
首先先把name和value拿过去,其他的先不管
最后得到一个jar,类似上面的,愿意的话也具有把domain和path的值带上,可以带可以不带,上回写request的时候,从浏览器提取放到了postman里,没有带domain和path,实际上带上kv值就ok了
带上cookie和没带上cookie
第一次没带上cookie以为你没登录,第二次带上cookie了就登录了
苦于写到文件里看看
找到退出就说明确实是登录了
可以用这个生产出一个cookie,然后拿着这个cookie用request爬取登录后才能访问的信息了
现在就可以连成一体了
上面的打开,这样就链接载一起了分割线上面是操作浏览器,下面就直接用库来web访问了,两种爬取方式不一样
用这样就可以实现完整的页面爬取,再也不用想办法绕过了
但是有些验证码很难,在爬虫 界,除非你训练的AI很好,否则很难斗过去,我们就需要像其他办法。有时候移动端暴露出来的接口更好去爬取,这就需要做一些代理,用移动端访问的时候做一些代理,然后过滤代理的地址。
公开数据可以爬取,但是涉及到用户隐私最好不要碰
元素如果可以点击直接调用.click即可
获得cookie直接交给requests,再requests之前获得了cookie对象,将这个cookie对象送给requests
requests拿到后就可以每次带上这个cookie,最后把信息获取到
这就是利用webdriver和selenium提供的操作浏览器的接口替我们模拟登录,和去获取模拟信息,不仅可以分析网页,还能拿到数据给爬虫或者分析程序进行处理。
但是selenium速度较慢,可以适当和requests结合起来
页面等待
页面等待的事情经常出现,比如ajax后加载的,表格里的数据还在转圈,没有加载出来,我们可以循环访问,但是这里提供了两种方式来等待页面元素加载,等待条件写的很灵活
页面等待技术就是为了,后加载的数据等待时间长,所以想办法解决,之前简单用time。sleep这样是可以的,但毕竟不搞基,selenium提供了俩种方式,显示等待和隐式等待。
隐式等待,等待特定的事件,显式等待,指定 一个条件,一直等到这个条件满足后继续执行,也可以设置超时事件,超时会抛异常
显式等待语法
有一些页面加载的时候,不显示就不加载了,鼠标滚下来才下载
这里叫显式的等待,需要用一个webdriverwait,这就是显式等待要调用的类,这个类要告诉它等待哪个driver驱动的浏览器,后面10可以 写时间,等10秒。
until直到什么时间为止,
find_element_byid可以写成这样
加了括号,送到里面去的,可能是个元组
说是在这个驱动器上等多久,到了什么时间,到什么条件满足为止(元素定位到,并且能够实现出来)
通过id找到的元素,已经加载到dom当中了,但不保证是可见的,比如有些div的样式是hidden的,元素是在dom树里,它是不可见的。
看看有多少选择
看当前页面的title包含了什么没有
最常用的就是这两个
判断某个元素是否被加载到了dom中,并不代表元素一定可见
判断元素是否可见。不是隐藏的,宽高也不是0
判断某个元素的text是否包含字符串
不存在dom树或者不可见
元素可以被点击,并且可见,这样可以判断有没有按钮去点击
下拉框里元素有没有被选择,下拉框有两种方式,一种是往下点就出来,还有是固定高度里面可以选择好几项
现在在url中,想要调用这个框子
这个框子就是inp-query
这样我们就找到搜索框了
现在可以等一段时间招搜索款框,找不到会暴露异常,现在去这个页面招搜索框,等10秒,不一定要呈现,但是一定要located定位到它,这个元素已经加到dom树中了,然后通过id去找
告诉你显式和隐式的等待
这种就不是机械式的等待,还可以设定超时时间。
试试找不到会做些什么
这两种用法相似,也就下面需要放元组
超时等不到了就报错
找到元素后,可以输入下,看看能不能搜索相应的电影
这样就找到了
上面是显式的
隐式的比较简单,在拿到driver的时候,
这里的10的意思就是但凡有找不到东西的,就等10秒
看看中间会不会等10秒,注释掉显式等待
一样也搜到了
搜索一个不存在的
等待可以用两种方式解决,显式的和隐式的,显式的相当于做好一个配置,只要以后用的时候出现了找不到的情况,就会等待,等待规定时间 还是没找到,就不等了
find没找到就是报,nosuchelement
只要有这个隐式,相当于统一配置找不到就报nosuchelement
如果在意内容还是建议采用等待的方式,其实用重复次数还是time.sleep,其实就是现在的隐式等待方式
复杂一点就用显式等待
显式等待的EC就是expected-_conditions期望等到的条件是什么,
显式等待的时候默认是每0.5秒去查看一次
webdriver是selenium的核心模块,从selenium2开始就是最重要的编程核心接口,驱动浏览器全靠这个包:
可以打开url,可以跟踪跳转,可以返回当前页面的实际URL
获取页面title
处理cookie
控制浏览器 操作,例如前进、后退、刷新、关闭,最大化等(其实是做web自动化要做这个事情,变大变小看看网页显示是否变形)
执行js脚本
在DOM中搜素页面元素web element,指定的或一批,find系方法
操作网页元素:
click可以点击
select模拟下拉框操作
send_keys键盘输入
text 获取元素文字
get_attribute 获取元素的属性
selenium是通过webdriver来驱动公祖,浏览器是一个独立的浏览器进程。两个进程,是有进程间的通信 。(js是在浏览器内部调用,跟selenium是不同的)