Python+Selenium爬虫之动态验证码的处理

目录

1.拖动下方滑块完成拼图(单独图片)

2.拖动下方滑块完成拼图(共同图片)


可拖动验证码分为空缺区域为单独的图片和空缺区域与背景图片为一个共同图片,所以实现方式有2种。

1.拖动下方滑块完成拼图(单独图片)

拖动验证码
  1. 实现原理: 查看空缺区域图片到左侧端点的距离d1,再次查看裁剪图片到左侧端点的距离d2,d1-d2的距离就是滑块拖动的距离。
  2. 实现方式:

1.获取图片验证码滑动区域的距离

def deal_verificationcode():
	s = Service("/usr/bin/chromedriver")
	options = webdriver.ChromeOptions()
	options.add_experimental_option('excludeSwitches', ['enable-automation'])
	options.add_argument('--headless')
	options.add_argument('--no-sandbox')
	global driver
	driver = webdriver.Chrome(service=s, options=options)
	driver.get(url)
	driver.find_element(by=By.TAG_NAME, value='textarea').send_keys(key)
	button = driver.find_element(by=By.XPATH, value='//*[@id="goodstrackText"]/div[1]/div[2]/div[1]/div/button')
	driver.execute_script("$(arguments[0]).click()", button)

	sleep(1)
	# 裁剪图片距离左侧位置
	left_distance1 = driver.find_element(By.ID, value='grap_cut').value_of_css_property('left')
	# 空缺区域距离左侧位置
	left_distance2 = driver.find_element(By.ID, value='grap_vacant').value_of_css_property('left')
	distance = float(left_distance2.split("px")[0]) - float(left_distance1.split("px")[0]) - float(10)

	run_slidingblock(distance)

2.距离获取后,拖动验证码

def run_slidingblock(distance):
	tracks = get_tracks(distance)
	num = 0
	for i in tracks:
		num += i
	if distance - 2 < num and num < distance + 2:
		track = tracks
	else:
		a = distance - num
		tracks.append(a)
		track = tracks
	drag = driver.find_element(by=By.ID, value='swipper-btn')
	ActionChains(driver).click_and_hold(drag).perform()
	for x in track:
		ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
	ActionChains(driver).release().perform()

def get_tracks(distance, rate=0.6, t=0.2, v=0):
	"""
	将distance分割成小段的距离
	:param distance: 总距离
	:param rate: 加速减速的临界比例
	:param a1: 加速度
	:param a2: 减速度
	:param t: 单位时间
	:param t: 初始速度
	:return: 小段的距离集合
	"""
	tracks = []
	# 加速减速的临界值
	mid = rate * distance
	# 当前位移
	s = 0
	# 循环
	while s < distance:
		# 初始速度
		v0 = v
		if s < mid:
			a = 40
		else:
			a = -3
		# 计算当前t时间段走的距离
		s0 = v0 * t + 0.5 * a * t * t
		# 计算当前速度
		v = v0 + a * t
		# 四舍五入距离,因为像素没有小数
		tracks.append(round(s0))
		# 计算当前距离
		s += s0
	return tracks

2.拖动下方滑块完成拼图(共同图片)

拖动验证码
  1. 实现原理: 计算背景图片中空缺区域到左侧端点的距离d1,再次查看裁剪图片到左侧端点的距离d2,d1-d2的距离就是滑块拖动的距离。
  2. 实现方式:

1.计算背景图片中空缺区域到左侧端点的距离

def deal_verificationcode():
	s = Service("/usr/bin/chromedriver")
	options = webdriver.ChromeOptions()
	options.add_experimental_option('excludeSwitches', ['enable-automation'])
	options.add_argument('--headless')
	options.add_argument('--no-sandbox')
	global driver
	driver = webdriver.Chrome(service=s, options=options)
	driver.get(url)
	sleep(1)
	driver.switch_to.frame('tcaptcha_iframe')
	get_img('cdn1')
	get_img('cdn2')
	x = FindPic('cdn1.jpg', 'cdn2.jpg')

	left_distance1 = driver.find_element(By.ID, value='slideBlock').value_of_css_property('left')
	log.info('验证码距离左侧距离为:' + str(left_distance1))
    distance = x - float(left_distance1.split("px")[0])
    
    run_slidingblock(distance)

2.距离获取后,拖动验证码

def run_slidingblock(distance):
	tracks = get_tracks(distance)
	num = 0
	for i in tracks:
		num += i
	if distance - 2 < num and num < distance + 2:
		track = tracks
	else:
		a = distance - num
		tracks.append(a)
		track = tracks
	drag = driver.find_element(by=By.ID, value='swipper-btn')
	ActionChains(driver).click_and_hold(drag).perform()
	for x in track:
		ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
	ActionChains(driver).release().perform()

def get_tracks(distance, rate=0.6, t=0.2, v=0):
	"""
	将distance分割成小段的距离
	:param distance: 总距离
	:param rate: 加速减速的临界比例
	:param a1: 加速度
	:param a2: 减速度
	:param t: 单位时间
	:param t: 初始速度
	:return: 小段的距离集合
	"""
	tracks = []
	# 加速减速的临界值
	mid = rate * distance
	# 当前位移
	s = 0
	# 循环
	while s < distance:
		# 初始速度
		v0 = v
		if s < mid:
			a = 40
		else:
			a = -3
		# 计算当前t时间段走的距离
		s0 = v0 * t + 0.5 * a * t * t
		# 计算当前速度
		v = v0 + a * t
		# 四舍五入距离,因为像素没有小数
		tracks.append(round(s0))
		# 计算当前距离
		s += s0
	return tracks

所谓的人生开挂,不过是厚积薄发! 欢迎评论和转载!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值