提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本项目将对“某站”登陆点选验证进行分析
首先,准备好相关库
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()