python绕开阿里云验证码acw_sc__v3

1、在做爬虫时遇到阿里云验证码,本来打算逆向js来生成cookie,但对我来说太难了,到了滑动轨迹哪里就不行了,然后尝试selenium+webdriver去模拟拖动滑块,但失败,网上搜索说selenium的标识太多,被检查到了。

 2、使用偏底层的pynput去控制鼠标,可以不被检测到。

        安装

pip install pynput
3、经过一番尝试过后成功绕开,完整代码如下:
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
from pynput.mouse import Button, Controller

def main():
    url = '网址'
    chromedriver_path = 'chromedriver.exe路径'
    # 设置为开发者模式
    options = webdriver.ChromeOptions()
    # options.add_argument('headless')
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 实例化一个chrome浏览器,并设置成窗口最大化
    browser = webdriver.Chrome(executable_path=chromedriver_path, options=options)
    browser.maximize_window()
    browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",}) 
    browser.get(url)
    browser.refresh()
    time.sleep(1+random.random())
    guidao = browser.find_element(By.XPATH,'//div[@class="nc_scale"]//div[@class="scale_text slidetounlock"]')
    # print(guidao.size['width'])
    # 获取滑块位置
    # spider_location = browser.find_element(By.XPATH,'//div[@class="nc_scale"]//span[@class="nc_iconfont btn_slide"]').location
    # spider_size= browser.find_element(By.XPATH,'//div[@class="nc_scale"]//span[@class="nc_iconfont btn_slide"]').size
    trace=get_trace(guidao.size['width'])
    # 打印出来方便调试
    # print(str(spider_location['x'])+','+str(spider_location['y']))
    mouse = Controller()
    i = 0
    while i < 3:
        browser.refresh()
        time.sleep(1+random.random())

        # 此处是把鼠标移动到滑块上
        
        x = 672 + (random.randint(-5,20))
        y = 376 + (random.randint(-5,20))
        mouse.position=(x,y)
        # print(mouse.position)
        # print('开始移动')
        mouse.press(Button.left)
        time.sleep(1+random.random())
        for d in trace:
            mouse.move(d,0)
            time.sleep(random.random()/10)
        mouse.release(Button.left)
        try:
            browser.find_element(By.XPATH,'//table')
            i = 3
            # print('验证通过')
            break
        except:
            continue
    cookie = browser.get_cookie('acw_sc__v3')
    print(cookie['value'])

def get_trace(distance):
	'''
	计算滑动
	'''
	lu = [0.7,0.3]
	# 创建存放轨迹信息的列表
	trace = []
	# 设置加速的距离
	#distance += 20
	faster_distance = distance+50

	# print('--------开始计算偏移量-------')
	for i in lu:
		the_distance = i*faster_distance
		# 设置初始位置、初始速度、时间间隔
		start, v0, t = 0, 0, 0.2
		# 当尚未移动到终点时
		while start < the_distance:
			# 如果处于加速阶段
			if start < the_distance:
				# 设置加速度为2
				a = 30
			# 如果处于减速阶段
			else:
				# 设置加速度为-3
				a = -30
			# 移动的距离公式
			move = v0 * t + 1 / 2 * a * t * t
			# 此刻速度
			v = v0 + a * t
			# 重置初速度
			v0 = v
			# 重置起点
			start += move
			# 将移动的距离加入轨迹列表
			trace.append(round(move,2))
	# print(trace)
		# 返回轨迹信息
	return trace

if __name__ == '__main__':
    main()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值