python模拟人工滑动_pyppeteer 模拟人工滑动验证(一)

本文介绍了如何使用pyppeteer库来模拟人工滑动验证,特别是处理存在iframe的情况。通过调用hover、down、move和up方法,并结合iframe内容帧的转换,实现了更接近人工操作的滑动轨迹。
摘要由CSDN通过智能技术生成

pyppeteer 有提供鼠标滑动的方法,但是单独调用 pyppeteer 滑动方法是无法通过验证的,必须使滑动轨迹更加接近人工的方式才行。

这里我们先了解一下pyppeteer是如何实现滑动的

一、pyppeteer 提供的滑动方法API

iframe.hover(slide_id) # 移动鼠标到滑块上方(聚焦)

page.mouse.down() # 按下鼠标

page.mouse.move() # 移动鼠标

page.mouse.up() # 松开鼠标

根据以上的4个方法组合就可以实现滑动。

二、滑动方法API详解

1.1 iframe.hover(slide_id) , slide_id是滑块的css选择器,例如'span#nc_1_n1z', 这个根据实际情况来指定。

这里需要注意的是iframe,什么意思呢?很多人给的参考都是直接调用page.hover(slide_id) ,但是很多情况在page里直接找调用hover(slide_id)是无法聚焦到滑块上的,这是因为滑块往往会加载在一个子页面 iframe 上,我们需要在找到 iframe ,然后在 iframe 上调用 hover 来聚焦滑块。

如果滑块已经页面page中,则直接调用 page.hover(slide_id), 无需这么复杂

1.2 如何找到 iframe

屏幕快照 2019-08-01 15.01.33.png

首先F12调出元素检查,查看滑块所在的窗口是否有 iframe,(或者直接 ctrl + f 搜索 iframe),

1.找出 iframe 的css选择器 :iframe#sufei-dialog-content (你应该根据实际情况填写)

2.在page中找到此 WebElement元素节点: iframe_element = await page.J('iframe#sufei-dialog-content')

此时还 无法在 iframe_element 上调用hover() 函数,因为iframe_element此时是 ElementHandle Class,而我们需要的是Frame Class

3.将ElementHandle Class强转成Frame Class :iframe =await iframe_element.contentFrame()

完整的方法应该是:

async def iframe_id2frame(iframe_id, page)

iframe_element = await page.J(iframe_id)

if iframe_element:

iframe =await iframe_element.contentFrame()

return iframe

else:

return None

slide_id = '#span……'

iframe_id = 'iframe.sd……'

iframe = await iframe_id2frame(iframe_id)

if iframe:

iframe.hover(slide_id)

2 page.mouse.down() 按下鼠标

这个没什么好说的,直接执行就好

3 page.mouse.move()

源码:async def move(self, x: float, y: float, options: dict = None,

**kwargs: Any) -> None:源码链接

其中x,y 是指移动到绝对横向,纵向坐标,options是一个字典,只有一个键steps,用来控制速度。

例如你想要鼠标向右移动500像素,则 x为当前横坐标 + 500,y为当前纵坐标不变。

当前的横坐标、纵坐标获取有些麻烦,网上也有人这样来滑动:

await page.mouse(10000,0) ,这样是指把鼠标横行移动到10000,纵向移动到零,滑动无法纵向移动,所以只能看到横行的移动效果。没有添加第三个参数,则默认一步完成 {'steps':1}

注意:这里的坐标和像素值是一致的,左上角为起点(0,0)

steps 是指分成几步来完成,steps越大,滑动速度越慢。(在源码中,steps是指移动到指定x,y 分段滑动的次数,但是每次启动滑动都会花费一定时间,可以认为steps是滑动的速度)

4 page.mouse.up() 松开鼠标

到现在,我们已经完成了滑动验证的功能,当然它还不够完善,但基本的功能已经齐全了,在下一节,介绍一下控制滑动轨迹,模拟人工滑动。

async def iframe_id2frame(iframe_id, page)

iframe_element = await page.J(iframe_id)

if iframe_element:

iframe =await iframe_element.contentFrame()

return iframe

else:

return None

# 1 聚焦

slide_id = '#span……'

iframe_id = 'iframe.sd……'

iframe = await iframe_id2frame(iframe_id)

if iframe:

# 如果滑块在页面page中,则直接调用 page.hover(slide_id),无需这么复杂

await iframe.hover(slide_id)

# 2 按下鼠标

await page.mouse.down()

# 3 滑动

await page.mouse.move(10000,0)

# 4 松开鼠标

await page.mouse.up()

注意1:这里pyppeteer涉及到 page 与 iframe,peppeteer的功能是以frame为基础单位来实现的,page 的功能 iframe 都有,page 在执行函数时,会先调用 frame = self.mainFrame,然后在frame上执行功能。mainFrame就是最外面的那个Frame

注意2: mouse对象是page/mainFrame对象所独有的,在子frame中,也就是iframe 中不能调用mouse对象。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值