亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python驗證碼識別教程之滑動驗證碼

2020-02-15 21:37:40
字體:
來源:轉載
供稿:網友

前言

上篇文章記錄了2種分割驗證碼的方法,此外還有一種叫做”滴水算法”(Drop Fall Algorithm)的方法,但本人智商原因看這個算法看的云里霧里的,所以今天記錄滑動驗證碼的處理吧。網上據說有大神已經破解了滑動驗證碼的算法,可以不使用selenium來破解,但本人能力不足還是使用笨方法吧。

基礎原理很簡單,首先點擊驗證碼按鈕后的圖片是滑動后的完整結果,點擊一下滑塊后會出現拼圖,對這2個分別截圖后比較像素值來找出滑動距離,并結合selenium來實現拖拽效果。

至于selenium怎么安裝就不說了,滑動驗證碼的一個難點就是要模擬人的拖拽行為,移動快了不行,慢了也不行。

這里以國家企業公示網站為例:

# -*- coding: utf-8 -*-import timeimport randomfrom io import BytesIOfrom PIL import Imagefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass Slide(object): """滑動驗證碼破解""" def __init__(self, target): self.target = target # 要搜索的公司名稱 self.driver = webdriver.Chrome() self.wait = WebDriverWait(self.driver, 10) def crop(self, left, top, right, bottom, pic_name): """截屏并裁剪""" ss = Image.open(BytesIO(self.driver.get_screenshot_as_png())) cp = ss.crop((left, top, right, bottom)) # 注意這里順序 cp.save(pic_name) return cp def calc_move(self, pic1, pic2): """根據閾值計算移動距離""" pix1 = pic1.load() pix2 = pic2.load() threshold = 200 move = 0 # 因為滑塊都從左向右滑動,而碎片本身寬度為60所以從60開始遍歷 for i in range(60, pic1.size[0]):  flag = False  for j in range(pic1.size[1]):  r = abs(pix1[i, j][0] - pix2[i, j][0])  g = abs(pix1[i, j][1] - pix2[i, j][1])  b = abs(pix1[i, j][2] - pix2[i, j][2])  # if r > threshold and g > threshold and b > threshold:  # 方法1:分別判斷rgb大于閾值  # flag = True  # break  if r + g + b > threshold:   # 方法2:判斷rgb總和跟閾值比較,效果比1好 為什么呢??   flag = True   break  if flag:  move = i  break return move def path1(self, distance): """繪制移動路徑方法1,構造一個等比數列""" q = 0.4 # 測試后發現0.4效果最佳 n = 10 # 最多移動幾次 a1 = ((1 - q) * distance) / (1 - q**n) result = [] for o in range(1, n + 1):  an = a1 * q**(o - 1)  if an < 0.1: # 小于移動閾值的就不要了  break  t = random.uniform(0, 0.5) # 測試后0.5秒的間隔成功率最高  result.append([an, 0, t]) return result def path2(self, distance): """繪制移動路徑方法2,模擬物理加速、減速運動,效果比1好""" result = [] current = 0 # 減速閾值 mid = distance * 4 / 5 # 計算間隔 t = 0.2 # 初速度 v = 0 while current < (distance - 10):  if current < mid:  # 加速度為正2  a = 2  else:  # 加速度為負3  a = -3  # 初速度v0  v0 = v  # 當前速度v = v0 + at  v = v0 + a * t  # 移動距離x = v0t + 1/2 * a * t^2  move = v0 * t + 0.5 * a * t * t  # 當前位移  current += move  # 加入軌跡  result.append([round(move), 0, random.uniform(0, 0.5)]) return result def run(self): self.driver.get("http://www.gsxt.gov.cn/index") input_box = self.driver.find_element_by_id('keyword') input_box.send_keys(self.target) search_btn = self.driver.find_element_by_id('btn_query') time.sleep(3) # 注意這里等一下再點,否則會出現卡死現象 search_btn.click() # 等待驗證碼彈出 bg_pic = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,         "gt_cut_fullbg"))) # html中坐標原點是左上角,右為x軸正方向,下為y軸正方向 # 輸出的x為正就是此元素距離屏幕左側距離 # 輸出的y為正就是此元素距離屏幕上側距離 # 所以我們需要截圖的四個距離如下: top, bottom, left, right = (  bg_pic.location['y'], bg_pic.location['y'] + bg_pic.size['height'],  bg_pic.location['x'], bg_pic.location['x'] + bg_pic.size['width']) time.sleep(1) cp1 = self.crop(left, top, right, bottom, '1.png') # 獲取滑塊按鈕并點擊一下 slide = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,        "gt_slider_knob"))) slide.click() time.sleep(3) # 等3秒報錯信息消失 TODO 這里應該可以改進 cp2 = self.crop(left, top, right, bottom, '2.png') move = self.calc_move(cp1, cp2) result = self.path1(move) # result = self.path2(move) # 拖動滑塊 ActionChains(self.driver).click_and_hold(slide).perform() for x in result:  ActionChains(self.driver).move_by_offset(xoffset=x[0],yoffset=x[1]).perform()  # ActionChains(driver).move_to_element_with_offset(to_element=slide,xoffset=x[0],yoffset=x[1]).perform()  time.sleep(x[-1]) # 如果使用方法1則需要sleep time.sleep(0.5) ActionChains(self.driver).release(slide).perform() # 釋放按鈕 time.sleep(0.8) element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "gt_info_text"))) ans = element.text if u"通過" in ans:  # 這里也需要等一下才能獲取到具體的鏈接  element = self.wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "search_list_item")))  for o in self.driver.find_elements_by_xpath(u"http://a[@target='_blank']"):  print(o.get_attribute("href"))  self.driver.quit() else:  print("識別失敗")  self.driver.quit()if __name__ == '__main__': s = Slide('中國平安') s.run()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品综合久久久久久五月天| 国产精品久在线观看| 伊人伊成久久人综合网站| 精品久久久久久久久久久| 一区三区二区视频| 国产精品私拍pans大尺度在线| 亚洲色图综合网| 欧美日韩另类字幕中文| 国产成人在线一区| 亚洲成人教育av| 国产日本欧美视频| 亚洲欧美国产高清va在线播| 国产精品96久久久久久又黄又硬| 欧美极品少妇xxxxⅹ免费视频| 精品亚洲男同gayvideo网站| 日韩成人av网址| 欧美电影院免费观看| 91精品国产免费久久久久久| 丰满岳妇乱一区二区三区| 亚洲码在线观看| 91久久嫩草影院一区二区| 国产精品久久久久久超碰| 91免费精品视频| 欧美高清视频免费观看| 欧美www视频在线观看| 亚洲精品乱码久久久久久按摩观| 亚洲欧美综合精品久久成人| 国产精品男人的天堂| 亚洲欧美激情视频| 欧美在线观看一区二区三区| 最近2019好看的中文字幕免费| 国产精品白丝jk喷水视频一区| 神马国产精品影院av| 最近2019免费中文字幕视频三| 久久视频在线观看免费| 亚洲精品国产福利| 尤物九九久久国产精品的特点| 久久影院免费观看| 国产精品96久久久久久又黄又硬| 97国产一区二区精品久久呦| 超碰精品一区二区三区乱码| 午夜精品久久久久久久男人的天堂| 668精品在线视频| 超薄丝袜一区二区| 国产国语刺激对白av不卡| 国产v综合v亚洲欧美久久| 亚洲欧美国产va在线影院| 91av视频在线免费观看| 国产精品成av人在线视午夜片| 欧美日韩国产色| 亚洲精品一区二区三区不| 亚洲国产成人爱av在线播放| 一区二区三区久久精品| 91禁外国网站| 亚洲欧美日韩天堂| 久久伊人91精品综合网站| 国产精品一区二区三区久久久| 91久久精品日日躁夜夜躁国产| 亚洲欧美另类人妖| 国产主播欧美精品| 国产免费一区二区三区在线观看| 欧美黄色片视频| 日韩在线视频网| 亚洲最新av在线网站| 亲子乱一区二区三区电影| 欧美日本黄视频| 日韩欧美精品免费在线| 久久香蕉国产线看观看av| 中文字幕欧美精品日韩中文字幕| 亚洲国产成人91精品| 亚洲欧美激情视频| 成人午夜在线观看| 久久精品小视频| 中文字幕av一区中文字幕天堂| 国产精品视频网站| 中文字幕成人精品久久不卡| 欧美日韩国产丝袜另类| 51ⅴ精品国产91久久久久久| 亚洲一区二区三区在线视频| 欧美精品一区在线播放| 亚洲人午夜精品免费| xvideos国产精品| 91大神在线播放精品| 亚洲国产欧美久久| 91精品国产91久久久久久不卡| 成人av在线亚洲| 亲爱的老师9免费观看全集电视剧| 亚洲精品电影在线观看| 欧美国产在线电影| 美乳少妇欧美精品| 日韩精品免费在线视频观看| 欧美国产日韩精品| 欧美激情二区三区| 国内精品视频久久| 国产精品免费一区| 日韩在线视频国产| 午夜精品久久久久久久99热| 亚洲人在线观看| 国产精品手机播放| 国产精品啪视频| 亚洲另类激情图| 欧美激情视频网| 久久成人在线视频| 国产91免费观看| 亚洲伊人久久大香线蕉av| 日韩极品精品视频免费观看| 欧美视频专区一二在线观看| 日韩av网站在线| 日本久久久a级免费| 97在线视频免费播放| 亚洲精品美女网站| 全亚洲最色的网站在线观看| 国产成人精品视频在线| 亚洲另类图片色| 欧美又大粗又爽又黄大片视频| 95av在线视频| 久久精品99国产精品酒店日本| 成人av在线天堂| 国产一区二区三区欧美| 亚洲国产精久久久久久| 国产精品一区久久久| 日韩av中文字幕在线免费观看| 97婷婷大伊香蕉精品视频| 国产精品第一页在线| 国产精品男女猛烈高潮激情| 亚洲丁香久久久| 亚洲一区av在线播放| 91av在线免费观看| 91日本在线视频| 日韩欧美中文第一页| 久久精品国产清自在天天线| 精品爽片免费看久久| 欧美日韩国产影院| 国产精品专区第二| 精品国产1区2区| 国内精品免费午夜毛片| 欧美日韩国产在线| 日韩免费观看在线观看| 国产午夜精品视频| 日韩高清电影免费观看完整| 欧美理论片在线观看| 国产精品久久99久久| 日韩女优人人人人射在线视频| 精品一区二区亚洲| 久久久国产视频91| 久久色精品视频| 欧美成人黄色小视频| 国产成人免费91av在线| 亚洲香蕉伊综合在人在线视看| 精品欧美国产一区二区三区| 欧美精品18videos性欧美| 亚洲欧洲日韩国产| 国产成人久久精品| 久久久久九九九九| 久久综合网hezyo| 91色p视频在线| 欧美一级淫片丝袜脚交| 国产一区二中文字幕在线看| 热re91久久精品国99热蜜臀| 国产午夜精品视频免费不卡69堂| 亚洲国内精品视频| 精品国产成人av| 欧美日韩一区免费| 久久精品国产一区|