亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python3 破解 geetest(極驗(yàn))的滑塊驗(yàn)證碼功能

 更新時(shí)間:2022年05月11日 08:28:58   作者:Kernel_wu  
這篇文章主要介紹了python3 破解 geetest(極驗(yàn))的滑塊驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

下面一段代碼給大家介紹python破解geetest 驗(yàn)證碼功能,具體代碼如下所示:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
import time,re, random
import requests
try:
  from StringIO import StringIO
except ImportError:
  from io import StringIO

#爬蟲模擬的瀏覽器頭部信息
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {
    'User-Agent': agent
    }

# 根據(jù)位置對(duì)圖片進(jìn)行合并還原
# filename:圖片
# location_list:圖片位置
#內(nèi)部兩個(gè)圖片處理函數(shù)的介紹
#crop函數(shù)帶的參數(shù)為(起始點(diǎn)的橫坐標(biāo),起始點(diǎn)的縱坐標(biāo),寬度,高度)
#paste函數(shù)的參數(shù)為(需要修改的圖片,粘貼的起始點(diǎn)的橫坐標(biāo),粘貼的起始點(diǎn)的縱坐標(biāo))
def get_merge_image(filename,location_list):
  #打開圖片文件
  im = image.open(filename)
  #創(chuàng)建新的圖片,大小為260*116
  new_im = image.new('RGB', (260,116))
  im_list_upper=[]
  im_list_down=[]
  # 拷貝圖片
  for location in location_list:
    #上面的圖片
    if location['y']==-58:
      im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))
    #下面的圖片
    if location['y']==0:
      im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))
  new_im = image.new('RGB', (260,116))
  x_offset = 0
  #黏貼圖片
  for im in im_list_upper:
    new_im.paste(im, (x_offset,0))
    x_offset += im.size[0]
  x_offset = 0
  for im in im_list_down:
    new_im.paste(im, (x_offset,58))
    x_offset += im.size[0]
  return new_im

#下載并還原圖片
# driver:webdriver
# div:圖片的div
def get_image(driver,div):
  #找到圖片所在的div
  background_images=driver.find_elements_by_xpath(div)
  location_list=[]
  imageurl=''
  #圖片是被CSS按照位移的方式打亂的,我們需要找出這些位移,為后續(xù)還原做好準(zhǔn)備
  for background_image in background_images:
    location={}
    #在html里面解析出小圖片的url地址,還有長高的數(shù)值
    location['x']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1])
    location['y']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2])
    imageurl=re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0]
    location_list.append(location)
  #替換圖片的后綴,獲得圖片的URL
  imageurl=imageurl.replace("webp","jpg")
  #獲得圖片的名字
  imageName = imageurl.split('/')[-1]
  #獲得圖片
  session = requests.session()
  r = session.get(imageurl, headers = headers, verify = False)
  #下載圖片
  with open(imageName, 'wb') as f:
    f.write(r.content)
    f.close()
  #重新合并還原圖片
  image=get_merge_image(imageName, location_list)
  return image

#對(duì)比RGB值
def is_similar(image1,image2,x,y):
  pass
  #獲取指定位置的RGB值
  pixel1=image1.getpixel((x,y))
  pixel2=image2.getpixel((x,y))
  for i in range(0,3):
    # 如果相差超過50則就認(rèn)為找到了缺口的位置
    if abs(pixel1[i]-pixel2[i])>=50:
      return False
  return True

#計(jì)算缺口的位置
def get_diff_location(image1,image2):
  i=0
  # 兩張?jiān)紙D的大小都是相同的260*116
  # 那就通過兩個(gè)for循環(huán)依次對(duì)比每個(gè)像素點(diǎn)的RGB值
  # 如果相差超過50則就認(rèn)為找到了缺口的位置
  for i in range(0,260):
    for j in range(0,116):
      if is_similar(image1,image2,i,j)==False:
        return i

#根據(jù)缺口的位置模擬x軸移動(dòng)的軌跡
def get_track(length):
  pass
  list=[]
  #間隔通過隨機(jī)范圍函數(shù)來獲得,每次移動(dòng)一步或者兩步
  x=random.randint(1,3)
  #生成軌跡并保存到list內(nèi)
  while length-x>=5:
    list.append(x)
    length=length-x
    x=random.randint(1,3)
  #最后五步都是一步步移動(dòng)
  for i in range(length):
    list.append(1)
  return list

#滑動(dòng)驗(yàn)證碼破解程序
def main():
  #打開火狐瀏覽器
  driver = webdriver.Firefox()
  #用火狐瀏覽器打開網(wǎng)頁
  driver.get("http://www.geetest.com/exp_embed")
  #等待頁面的上元素刷新出來
  WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("http://div[@class='gt_slider_knob gt_show']").is_displayed())
  WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("http://div[@class='gt_cut_bg gt_show']").is_displayed())
  WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("http://div[@class='gt_cut_fullbg gt_show']").is_displayed())
  #下載圖片
  image1=get_image(driver, "http://div[@class='gt_cut_bg gt_show']/div")
  image2=get_image(driver, "http://div[@class='gt_cut_fullbg gt_show']/div")
  #計(jì)算缺口位置
  loc=get_diff_location(image1, image2)
  #生成x的移動(dòng)軌跡點(diǎn)
  track_list=get_track(loc)
  #找到滑動(dòng)的圓球
  element=driver.find_element_by_xpath("http://div[@class='gt_slider_knob gt_show']")
  location=element.location
  #獲得滑動(dòng)圓球的高度
  y=location['y']
  #鼠標(biāo)點(diǎn)擊元素并按住不放
  print ("第一步,點(diǎn)擊元素")
  ActionChains(driver).click_and_hold(on_element=element).perform()
  time.sleep(0.15)
  print ("第二步,拖動(dòng)元素")
  track_string = ""
  for track in track_list:
    #不能移動(dòng)太快,否則會(huì)被認(rèn)為是程序執(zhí)行
    track_string = track_string + "{%d,%d}," % (track, y - 445)
    #xoffset=track+22:這里的移動(dòng)位置的值是相對(duì)于滑動(dòng)圓球左上角的相對(duì)值,而軌跡變量里的是圓球的中心點(diǎn),所以要加上圓球長度的一半。
    #yoffset=y-445:這里也是一樣的。不過要注意的是不同的瀏覽器渲染出來的結(jié)果是不一樣的,要保證最終的計(jì)算后的值是22,也就是圓球高度的一半
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-445).perform()
    #間隔時(shí)間也通過隨機(jī)函數(shù)來獲得,間隔不能太快,否則會(huì)被認(rèn)為是程序執(zhí)行
    time.sleep(random.randint(10,50)/100)
  print (track_string)
  #xoffset=21,本質(zhì)就是向后退一格。這里退了5格是因?yàn)閳A球的位置和滑動(dòng)條的左邊緣有5格的距離
  ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
  time.sleep(0.1)
  ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
  time.sleep(0.1)
  ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
  time.sleep(0.1)
  ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
  time.sleep(0.1)
  ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
  print ("第三步,釋放鼠標(biāo)")
  #釋放鼠標(biāo)
  ActionChains(driver).release(on_element=element).perform()
  time.sleep(3)
  #點(diǎn)擊驗(yàn)證
  # submit = driver.find_element_by_xpath("http://div[@class='gt_ajax_tip success']")
  # print(submit.location)
  # time.sleep(5)
  #關(guān)閉瀏覽器,為了演示方便,暫時(shí)注釋掉.
  #driver.quit()

#主函數(shù)入口
if __name__ == '__main__':
  pass
  main()

總結(jié)

以上所述是小編給大家介紹的python3 破解 geetest(極驗(yàn))的滑塊驗(yàn)證碼功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python?matplotlib實(shí)戰(zhàn)之雷達(dá)圖繪制

    Python?matplotlib實(shí)戰(zhàn)之雷達(dá)圖繪制

    雷達(dá)圖(Radar?Chart),也被稱為蛛網(wǎng)圖或星型圖,是一種用于可視化多個(gè)變量之間關(guān)系的圖表形式,本文主要為大家介紹了如何使用Matplotlib繪制雷達(dá)圖,需要的小伙伴可以參考下
    2023-08-08
  • Python實(shí)現(xiàn)簡易五子棋游戲

    Python實(shí)現(xiàn)簡易五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python連接MySQL數(shù)據(jù)庫的簡單便捷方法

    Python連接MySQL數(shù)據(jù)庫的簡單便捷方法

    在數(shù)據(jù)分析過程中往往要操作較大的數(shù)據(jù)集,這就需要連接數(shù)據(jù)庫進(jìn)行操作,下面這篇文章主要給大家介紹了關(guān)于Python連接MySQL數(shù)據(jù)庫的簡單便捷方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Python中使用PyHook監(jiān)聽鼠標(biāo)和鍵盤事件實(shí)例

    Python中使用PyHook監(jiān)聽鼠標(biāo)和鍵盤事件實(shí)例

    這篇文章主要介紹了Python中使用PyHook監(jiān)聽鼠標(biāo)和鍵盤事件實(shí)例,這個(gè)庫依賴于另一個(gè)Python庫PyWin32,并且只能運(yùn)行在Windows平臺(tái),需要的朋友可以參考下
    2014-07-07
  • 在CentOS7下安裝Python3教程解析

    在CentOS7下安裝Python3教程解析

    這篇文章主要介紹了在CentOS7下安裝Python3教程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Windows下安裝Scrapy

    Windows下安裝Scrapy

    今天小編就為大家分享一篇關(guān)于Windows下安裝Scrapy,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • python進(jìn)階教程之函數(shù)參數(shù)的多種傳遞方法

    python進(jìn)階教程之函數(shù)參數(shù)的多種傳遞方法

    這篇文章主要介紹了python進(jìn)階教程之函數(shù)參數(shù)的多種傳遞方法,包括關(guān)鍵字傳遞、默認(rèn)值傳遞、包裹位置傳遞、包裹關(guān)鍵字混合傳遞等,需要的朋友可以參考下
    2014-08-08
  • Python?pyecharts?Map地圖數(shù)據(jù)不顯示的原因及完美解決

    Python?pyecharts?Map地圖數(shù)據(jù)不顯示的原因及完美解決

    這篇文章主要給大家介紹了關(guān)于Python?pyecharts?Map地圖數(shù)據(jù)不顯示的原因及解決辦法,pyecharts是一款將python與echarts結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具,文中通過圖文以及代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 關(guān)于numpy數(shù)組中元素單個(gè)選取或部分選取問題

    關(guān)于numpy數(shù)組中元素單個(gè)選取或部分選取問題

    這篇文章主要介紹了關(guān)于numpy數(shù)組中元素單個(gè)選取或部分選取問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例

    python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例

    這篇文章主要介紹了python實(shí)現(xiàn)數(shù)通設(shè)備端口監(jiān)控示例,需要的朋友可以參考下
    2014-04-04

最新評(píng)論