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()