爬虫-selenium实现验证码自动登录(14)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了爬虫-selenium实现验证码自动登录(14),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2924字,纯文字阅读大概需要5分钟。
内容图文
import time from io import BytesIO import random import requests from selenium import webdriver from selenium.webdriver import ActionChains from PIL import Image url = "https://www.douban.com/" browser = webdriver.Chrome(executable_path="E:/爬虫0基础入门/chromedriver_win32/chromedriver.exe") #2. 点击元素显示出有缺口的图片并下载 #3. 对比两张图片找出缺口的移动像素 #4. 拖动元素 url = "https://passport.bilibili.com/login"def compare_pixel(image1, image2, i, j): #判断两个像素是否相同 pixel1 = image1.load()[i, j] pixel2 = image2.load()[i, j] threshold = 60 if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold: return True return False def crop_image(image_file_name): #截图验证码图片#定位某个元素在浏览器中的位置 time.sleep(2) img = browser.find_element_by_xpath("//*[@class=‘gt_box‘]") location = img.location print("图片的位置", location) size = img.size top, buttom, left, right = location["y"], location["y"]+size["height"], location["x"], location[‘x‘] + size["width"] print("验证码位置", left,top, right, buttom) screenshot = browser.get_screenshot_as_png() screenshot = Image.open(BytesIO(screenshot)) captcha = screenshot.crop((int(left),int(top), int(right), int(buttom))) captcha.save(image_file_name) return captcha def login(): username = "17716131585" password = "123456" browser.get(url) browser.maximize_window() #很重要!! username_ele = browser.find_element_by_xpath("//input[@id=‘login-username‘]") password_ele = browser.find_element_by_xpath("//input[@id=‘login-passwd‘]") username_ele.send_keys(username) password_ele.send_keys(password) # 1. 鼠标移动到正确的元素上,显示出没有缺口的图片并下载 time.sleep(2) slider = browser.find_element_by_xpath("//div[@class=‘gt_slider_knob gt_show‘]") ActionChains(browser).move_to_element(slider).perform() #如果截取图片 image1 = crop_image("captcha1.png") #获取缺口图片 ActionChains(browser).click_and_hold(slider).perform() time.sleep(1) image2 = crop_image("captcha2.png") #获取缺口图片的位置 left = 60 has_find = False for i in range(left, image1.size[0]): if has_find: breakfor j in range(image1.size[1]): ifnot compare_pixel(image1, image2, i, j): left = i has_find = True break left -= 6 print(left) #拖动图片# 根据偏移量获取移动轨迹# 一开始加速,然后减速,生长曲线,且加入点随机变动# 移动轨迹 track = [] # 当前位移 current = 0 # 减速阈值 mid = left * 3 / 4 # 间隔时间 t = 0.1 v = 0 while current < left: if current < mid: a = random.randint(2, 3) else: a = - random.randint(6, 7) v0 = v # 当前速度 v = v0 + a * t # 移动距离 move = v0 * t + 1 / 2 * a * t * t # 当前位移 current += move track.append(round(move)) # ActionChains(browser).click_and_hold(slider).perform()for x in track: ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform() time.sleep(0.5) ActionChains(browser).release().perform() time.sleep(3) try: browser.find_element_by_xpath("//span[contains(text(), ‘验证通过‘)]") return True except Exception as e: if login(): return True if__name__ == "__main__": login()
原文:https://www.cnblogs.com/topass123/p/13353365.html
内容总结
以上是互联网集市为您收集整理的爬虫-selenium实现验证码自动登录(14)全部内容,希望文章能够帮你解决爬虫-selenium实现验证码自动登录(14)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。