3.接口绕过
今天主要分享的是通过图像处理的方法来处理滑动验证码。以豆瓣官网为例,进入官网之后,点击密码登录,输入账号和密码之后,点击登录,即可跳出滑动验证码,随即人工操作即可成功。那我们现在使用自动化的方式来操作这一系列步骤。
整个过程可以分为以下几步:
1.显示验证码7.滑动失败后增加重试机制
pip install opencv-python完整代码如下
import cv2 from selenium import webdriver import requests from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() while True: # 堆代码 duidaima.com #1. 显示滑动验证码 driver.get('https://www.douban.com/') driver.implicitly_wait(10) sleep(3) driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')) driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click() driver.find_element(By.XPATH,"//*[@id='username']").send_keys("18888888888") driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("123456") driver.find_element(By.XPATH,'/html/body/div[1]/div[2]/div[1]/div[5]/a').click() sleep(2) #2. 获取到滑块以及滑板到图片地址 driver.switch_to.frame(driver.find_element(By.XPATH,'//*[@id="tcaptcha_iframe"]')) ##2.1 滑块 slideBlock = driver.find_element(By.XPATH,'//*[@id="slideBlock"]') slideBlock_url = slideBlock.get_attribute("src") ##2.2 滑板 slideBg = driver.find_element(By.XPATH,'//*[@id="slideBg"]') slideBg_url = slideBg.get_attribute("src") #print(slideBg_url) #print(slideBlock_url) #3. 下载滑块和滑板 with open('images/big_images.jpg','wb') as f: f.write(requests.get(slideBg_url).content) f.close() with open('images/small_images.jpg','wb') as f: f.write(requests.get(slideBlock_url).content) f.close() #4. 智能匹配滑块和滑板的小图重叠后x的距离 big_grag = cv2.imread("images/big_images.jpg",0) # 以灰度模式加载图片 small_grag = cv2.imread("images/small_images.jpg",0) # 以灰度模式加载图片) res = cv2.matchTemplate(big_grag,small_grag,cv2.TM_CCORR_NORMED) #匹配对象 cv2.imread value = cv2.minMaxLoc(res) print("value的值",value) x = value[2][0] print(x) #5. 缩放比例以及校准滑块偏移量,原图是680*390,实际是282*162 x = int(x*282/680) py = 31 - int(20*282/680) x = x-py print(x) #6. 通过ActionChains滑动解锁 hk_ele = driver.find_element(By.XPATH,'//*[@id="slideBlock"]') action = ActionChains(driver) # 初始化一个鼠标对象 action.click_and_hold(hk_ele).perform() #鼠标按住不动 action.drag_and_drop_by_offset(hk_ele,x,0).perform() #把滑动移动到指定的坐标,0代表纵坐标 sleep(3) ## 如果元素不存在,则表示成功 #7. 滑动失败后增加重试机制 try: driver.find_element(By.XPATH,'//*[@id="captcha_close"]/div') except Exception as e: break