首页 > 其他分享 >DrissionPage解决滑动验证

DrissionPage解决滑动验证

时间:2024-09-13 09:50:57浏览次数:3  
标签:DrissionPage 验证 webpage cv2 ele input 滑动 month select

之前爬取某数据统计平台时遇到了相当严重的反爬机制,采用普通的Selenium也无法绕过。之前尝试过undetected_chromedriver可以使用,但无法设置无头模式,使用起来还是有一定的不美观性。正好近日学习了Drission Page这款相当高效的工具,顺手掏出这个项目重构了一下。填输入数据相当简单:

import os
import cv2
import time
import random
from datetime import datetime
from DrissionPage import ChromiumPage
from DrissionPage import ChromiumOptions

input_code = ""

# 创建页面对象
co = ChromiumOptions().auto_port()  # 指定程序每次使用空闲的端口和临时用户文件夹创建浏览器
co.set_argument('--no-sandbox')  # 无沙盒模式
co.set_argument('--headless=new')  # 无界面系统添加
co.set_argument('--disable-gpu')    # 禁用gpu,提高加载速度
co.set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36") 

# 创建浏览器窗口
webpage = ChromiumPage(co)


url = ""
webpage.get(url)
webpage.wait(5)

# 选择出口
out_span = webpage.ele('@text()=出口')
out_input = out_span.next('tag:input')
out_input.click()

# 选择币种
currency_span = webpage.ele('@text()=美元')
currency_input = currency_span.next('tag:input')
currency_input.click()

# 选择分月输出
by_month_input = webpage.ele('@name=monthFlag')
by_month_input.click()

# 起止年月
start_select = webpage.ele('@id=startMonth')
end_select = webpage.ele('@id=endMonth')
if start_select.child(-2):
    start_month_option = start_select.child(-2)
else:
    start_month_option = start_select.child(-1)
end_month_option = end_select.child(-1)
start_month_value = start_month_option.attr('value')
end_month_value = end_month_option.attr('value')
start_select.select.by_option(start_month_option)
end_select.select.by_option(start_month_option)

output_field_select_1 = webpage.ele('@id=outerField1')
output_field_select_2 = webpage.ele('@id=outerField2')
output_field_select_1.select.by_value("CODE_TS")
output_field_select_2.select.by_value("ORIGIN_COUNTRY")
output_field_input_1 = webpage.ele("@id=outerValue1")
output_field_input_1.input("85434000,85439090,24041100,24041200,24041990")


do_search_button = webpage.ele('@@tag()=a@@id=doSearch', timeout=2)
do_search_button.click()
time.sleep(1)
# webpage.get_screenshot('test_dp.png')

try:
    webpage.ele('xpath://div[@class="layui-layer-btn"]/a[@class="layui-layer-btn0"]', timeout=2).click()
except:
    pass
time.sleep(1)


这里进入到滑块验证界面,也算是一个难点:

参考了网上的一些方法,通过将缺口图片和背景图用cv2进行一些处理来获取滑动量。但是最后结果并不准确,研究后发现是因为缺口小图并不准确。以另一幅图为例,获取到的小图和背景分别是:

缺口小图
背景图

 可以发现直接通过get_screenshot()的方法获取到的小图并不是真的小图。暂时没发现准确获取小图的方法。转换了一下思路,只需要在背景图里找出面积较大的白色区域,就是缺口了。(滑动轨迹模拟的代码源于网络)

def find_blank_region(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 500]
    largest_contour = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(largest_contour)
    return x


# 滑动轨迹模拟 
def generate_track(distance):
    def __ease_out_expo(step):
        return 1 if step == 1 else 1 - pow(2, -10 * step)

    tracks = [[random.randint(20, 60), random.randint(10, 40), 0]]
    count = 30 + int(distance / 2)
    _x, _y = 0, 0
    for item in range(count):
        x = round(__ease_out_expo(item / count) * distance)
        t = random.randint(10, 20)
        if x == _x:
            continue
        tracks.append([x - _x, _y, t])
        _x = x
    tracks.append([0, 0, random.randint(200, 300)])
    times = sum([track[2] for track in tracks])
    return tracks, times

然后运用这两个函数拖动滑块完成验证。这里虽然设置了一直循环,但是大部分情况只需要一次就够了。

while True:
    background_canvas = webpage.ele('xpath://div[@id="captcha"]/canvas', timeout=2)
    background_canvas.get_screenshot('captcha.png')
    background_pic = cv2.imread('captcha.png')
    x_num = find_blank_region(background_pic) * 1.08 
    print(x_num)
    element = webpage.ele('xpath://div[@class="sliderMask"]/div[@class="slider"]')
    element.drag(offset_x=x_num/2, duration=1)
    # webpage.get_screenshot('test_move.png')
    msg = webpage.ele('xpath://div[@id="msg"]', timeout=2).text
    print(msg)
    if msg == '验证通过!':
        time.sleep(2)
        webpage.ele('xpath://div[@class="page-container"]//a[@id="doSearch"]', timeout=2).click()
        break
    time.sleep(3)


最后下载csv:

time.sleep(random.randint(6,8))
download_button = webpage.ele('@@tag()=span@@text()=导出数据')
download_button.click()
confirm_download_button = webpage.ele('@@tag()=a@@class=layui-layer-btn0')
mission = confirm_download_button.click.to_download(r'D:/', 'test2.csv')
mission.wait()
# webpage.get_screenshot('test_dp2.png')

标签:DrissionPage,验证,webpage,cv2,ele,input,滑动,month,select
From: https://blog.csdn.net/m0_55893050/article/details/142201848

相关文章

  • 【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项
    前言:滑动窗口其实基本原理还是双指针,但在双指针中左右指针可能会有回退操作,而滑动窗口的左右指针只会向前走,不会回退,下面就来讲解一下滑动窗口的概念和具体操作(主要是例题讲解)目录一、什么是滑动窗口?二、滑动窗口的原理三、滑动窗口的算法实现四、滑动窗口的例题讲解......
  • 【移远EC800M-CN 】GNSS功能打开和关闭关闭步骤验证
    引言本文章使用自研“超小体积TTL转4G+GPS集成模块”进行实测验证; 一、打开GNSS功能步骤一、通过AT+QGPSCFG=?配置GNSS参数(1)该命令用于查询和配置GNSS不同的设置,包括NMEA语句输出端口、NMEA语句的输出类型等。1.1、配置NMEA语句输出端口AT+QGPSCFG="outport",ua......
  • vue2动态生成(绘制)图形验证码(验证码图片)
     方案1:js绘制条形验证码 参考文档:https://blog.csdn.net/LOVE_mingjing/article/details/130622848 utils文件夹下新建GVerify.js文件:functionGVerify(options){//创建一个图形验证码对象,接收options对象为参数this.options={//默认options参数值......
  • 多表单验证
    <scriptsetuplang="ts">import{ref}from'vue';import{Modal,message}from'ant-design-vue';import{AIRPLANE_MISSION_MODE}from'../enum';importtype{deviceAirPortLoad}from'./columns'......
  • PbootCMS如何取消后台、留言、自定义表单验证码
    取消PBootCMS后台、留言、自定义表单的验证码是一个相对直接的过程。如果你想要取消这些地方的验证码,可以按照以下步骤操作:登录后台:使用管理员账号登录PBootCMS的后台管理系统。进入全局配置:在后台管理界面中,找到“全局配置”或类似的设置入口。找到安全配置:在......
  • LeetCode算法—滑动窗口
    一:滑动窗口1、窗口:滑动窗口的核心就是一个窗口;通常使用两个指针表示(一个指向左边界;一个指向右边界);窗口中的元素就是当前字串2、滑动:窗口从数组或字符串的起始位置开始,逐步向右滑动。当窗口无法满足条件时,调整左边界以缩小窗口;当窗口满足条件时,尝试记录当前窗口的结果,并继续调整......
  • 手搓一个验证码
    importioimportosimportstringfromrandomimportchoice,randrange,samplefromPILimportImage,ImageDraw,ImageFontdefgenerate_captcha():img_width=58img_height=30font_size=16font_color=["black","dark......
  • 滑动窗口&动态规划-1031. 两个非重叠子数组的最大和
    问题描述问题求解本题还挺巧妙,有点类似两数和的扩展题。对于两个线段,我们可以固定右线段,然后寻找左线段的最大值。固定右线段使用到的算法是滑动窗口,寻找左线段最大值的算法是动态规划。时间复杂度:O(n)classSolution:defmaximizeWin(self,prizePositions:List[int......
  • HarmonyOS开发之NestedScroll嵌套滑动
    在Harmony应用开发中,为了提高用户体验,开发者经常需要实现复杂的滑动交互效果。特别是在一些需要内外层滑动结合的应用场景下,如何优雅地处理这些滑动事件变得尤为重要。本文将探讨两种使用nestedScroll机制来实现滑动布局的方法,并附上相应的代码示例。场景一:基于NestedScroll实现Wat......
  • 《JavaEE进阶》----14.<SpringMVC配置文件实践之【验证码项目】>
    本篇博客介绍的是Google的开源项目Kaptcha来实现的验证码。这种是最简单的验证码。也是很常见的一种验证码。可以去看项目结果展示。就可以明白这个项目了。前言:随着安全性的要求越来越高、很多项目都使用了验证码。如今验证码的形式也是有许许多多、更复杂的图形验证码......