selenium过某站点选验证

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本项目将对“某站”登陆点选验证进行分析

请添加图片描述

首先,准备好相关库
selenium, requests,time等

一、确认目标

请添加图片描述

二、用selenium找到此节点并进行模拟点击

1.引入库并查找

代码如下:

iimport json
import time

import requests
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
#事件链
from selenium.webdriver.common.action_chains import ActionChains


web = Chrome()
web.get('https://某站(自己可以找到网址,平台不允许放).com/')
time.sleep(2)
web.find_element(By.XPATH,'//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div[1]/div/span').click()

2.同样的方法找到两个input文本框

代码如下(示例):

web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/form/div[1]/input').send_keys('账号')
web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/form/div[3]/input').send_keys('密码')
time.sleep(2)


#模拟点击登陆
web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/div[2]/div[2]').click()
web.implicitly_wait(5) #隐示等待 最多等待5

三、获取到验证码的图

在这里插入图片描述
代码如下:

#获取到验证码的图
verify_div = web.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[6]/div/div')
time.sleep(1)
verify_div.screenshot('tu.png')  #截图保存
tu = verify_div.screenshot_as_base64  #转成b64格式 要调用打码平台接口识别验证码

1.调用接口识别

verify_code = base64_api(tu)   #开始识别
print(verify_code)

2.控制台打印出点选的坐标

在这里插入图片描述
然后进行循环切片拿到x,y的坐标进行点选
代码如下:

for i in verify_code.split('|'):
    x= int(i.split(',')[0])
    y= int(i.split(',')[1])                                                              #perform 提交事件 ,不提交不起作用
    ActionChains(web).move_to_element_with_offset(verify_div,xoffset=x,yoffset=y).click().perform()
    #offset:偏移量 以截的图左上为基准点进行偏移,x,y两个参数决定偏移的位置,最后perform()进行提交
    time.sleep(1)
time.sleep(2)
web.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[6]/div/div/div[3]/a/div').click()

四、最后成功登陆

完整代码:

import json
import time

import requests
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
#事件链
from selenium.webdriver.common.action_chains import ActionChains

def base64_api( img, typeid=27,uname='xxx', pd='xxxx'):
    # with open(img, 'rb') as f:
    #     base64_data = base64.b64encode(f.read())
    #     b64 = base64_data.decode()
    data = {"username": uname, "password": pd, "typeid": typeid, "image": img}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        # !!!!!!!注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别
        return result["message"]

web = Chrome()
web.get('https://某站(自己可以找到网址,平台不允许放).com/')
time.sleep(2)
web.find_element(By.XPATH,'//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div[1]/div/span').click()
time.sleep(2)
web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/form/div[1]/input').send_keys('xxxx')
web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/form/div[3]/input').send_keys('xxxx')
time.sleep(2)
web.find_element(By.XPATH,'/html/body/div[3]/div/div[4]/div[2]/div[2]/div[2]').click()
web.implicitly_wait(3)

#获取到验证码的图
verify_div = web.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[6]/div/div')
time.sleep(1)
verify_div.screenshot('img.png')  #截图保存
img = verify_div.screenshot_as_base64  #转成b64格式 要调用打码平台接口识别验证码

verify_code = base64_api(tu)   #开始识别
print(verify_code)
# print(tu)

for i in verify_code.split('|'):
    x= int(i.split(',')[0])
    y= int(i.split(',')[1])                                                              #perform 提交事件 ,不提交不起作用
    ActionChains(web).move_to_element_with_offset(verify_div,xoffset=x,yoffset=y).click().perform()
    #offset:偏移量 以截的图左上为基准点进行偏移,x,y两个参数决定偏移的位置,最后perform()进行提交
    time.sleep(1)
time.sleep(2)
web.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[6]/div/div/div[3]/a/div').click()
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值