最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python驗(yàn)證碼識別教程之滑動驗(yàn)證碼

 更新時間:2018年06月04日 11:48:11   作者:Hi!Roy!  
這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識別教程之滑動驗(yàn)證碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

這里以國家企業(yè)公示網(wǎng)站為例:

# -*- coding: utf-8 -*-
import time
import random
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class Slide(object):
 """滑動驗(yàn)證碼破解"""

 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):
 """根據(jù)閾值計(jì)算移動距離"""
 pix1 = pic1.load()
 pix2 = pic2.load()
 threshold = 200
 move = 0
 # 因?yàn)榛瑝K都從左向右滑動,而碎片本身寬度為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,構(gòu)造一個等比數(shù)列"""
 q = 0.4 # 測試后發(fā)現(xiàn)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,模擬物理加速、減速運(yùn)動,效果比1好"""
 result = []
 current = 0
 # 減速閾值
 mid = distance * 4 / 5
 # 計(jì)算間隔
 t = 0.2
 # 初速度
 v = 0
 while current < (distance - 10):
  if current < mid:
  # 加速度為正2
  a = 2
  else:
  # 加速度為負(fù)3
  a = -3
  # 初速度v0
  v0 = v
  # 當(dāng)前速度v = v0 + at
  v = v0 + a * t
  # 移動距離x = v0t + 1/2 * a * t^2
  move = v0 * t + 0.5 * a * t * t
  # 當(dāng)前位移
  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) # 注意這里等一下再點(diǎn),否則會出現(xiàn)卡死現(xiàn)象
 search_btn.click()
 # 等待驗(yàn)證碼彈出
 bg_pic = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,
         "gt_cut_fullbg")))
 # html中坐標(biāo)原點(diǎn)是左上角,右為x軸正方向,下為y軸正方向
 # 輸出的x為正就是此元素距離屏幕左側(cè)距離
 # 輸出的y為正就是此元素距離屏幕上側(cè)距離
 # 所以我們需要截圖的四個距離如下:
 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')

 # 獲取滑塊按鈕并點(diǎn)擊一下
 slide = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,
        "gt_slider_knob")))
 slide.click()
 time.sleep(3) # 等3秒報(bào)錯信息消失 TODO 這里應(yīng)該可以改進(jìn)
 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()

代碼中注釋很詳細(xì)就不多說了,如果運(yùn)行時候提示

selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

則需要到 https://sites.google.com/a/chromium.org/chromedriver/home 下載驅(qū)動后解壓到/usr/local/bin目錄即可。
使用服務(wù)器運(yùn)行時使用phantomjs替換chrome,另外失敗的時候可以進(jìn)行判斷自動重試,有興趣的小伙伴可以自己補(bǔ)充完善。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Django 登錄注冊的實(shí)現(xiàn)示例

    Django 登錄注冊的實(shí)現(xiàn)示例

    本文主要介紹了Django 登錄注冊的實(shí)現(xiàn)示例,這是做網(wǎng)頁登錄和注冊基本上都是必要一步,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • python?selenium中Excel數(shù)據(jù)維護(hù)指南

    python?selenium中Excel數(shù)據(jù)維護(hù)指南

    這篇文章主要給大家介紹了關(guān)于python?selenium中Excel數(shù)據(jù)維護(hù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • 簡單了解Python變量作用域正確使用方法

    簡單了解Python變量作用域正確使用方法

    這篇文章主要介紹了簡單了解Python變量作用域正確使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 詳解如何通過Python制作一個密碼生成器

    詳解如何通過Python制作一個密碼生成器

    定期更換密碼是一種非常重要的安全措施,這種做法可以有效地保護(hù)你的賬戶和個人信息不受黑客和網(wǎng)絡(luò)攻擊者的侵害。所以本文就來用Python制作一個密碼生成器吧
    2023-05-05
  • Python三種打包exe方法案例教程

    Python三種打包exe方法案例教程

    這篇文章主要介紹了Python三種打包exe方法案例教程,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項(xiàng)的案例

    python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項(xiàng)的案例

    這篇文章主要介紹了python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項(xiàng)的案例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • jupyter notebook 中輸出pyecharts圖實(shí)例

    jupyter notebook 中輸出pyecharts圖實(shí)例

    這篇文章主要介紹了jupyter notebook 中輸出pyecharts圖實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 樹莓派4B安裝Tensorflow的方法步驟

    樹莓派4B安裝Tensorflow的方法步驟

    這篇文章主要介紹了樹莓派4B安裝Tensorflow的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python中使用Minio實(shí)現(xiàn)圖像或視頻文件存儲的步驟

    Python中使用Minio實(shí)現(xiàn)圖像或視頻文件存儲的步驟

    本文章向大家介紹了Minio這一款簡易的云存儲服務(wù)器,并講述了如何在Python中去使用Minio,實(shí)現(xiàn)了視頻文件的上傳和獲取,感興趣的朋友一起看看吧
    2025-02-02
  • Python3字符串encode與decode的講解

    Python3字符串encode與decode的講解

    今天小編就為大家分享一篇關(guān)于Python3字符串encode與decode的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論

平乐县| 师宗县| 濮阳县| 化州市| 政和县| 古交市| 来安县| 汉中市| 宁夏| 龙胜| 甘肃省| 江门市| 永昌县| 石柱| 阳高县| 胶南市| 龙里县| 潼关县| 若尔盖县| 公主岭市| 石台县| 绿春县| 陆良县| 深圳市| 芦山县| 含山县| 共和县| 五大连池市| 岳阳县| 库伦旗| 通许县| 五原县| 东莞市| 永丰县| 子洲县| 桂阳县| 福鼎市| 定州市| 靖宇县| 永修县| 沈丘县|