日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)

發(fā)布時間:2025/5/22 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、極驗驗證碼(geetest)的三種驗證模式

以極驗官網(wǎng)登錄(https://auth.geetest.com/login/)為例:

?

?在點擊 “點擊按鈕進(jìn)行驗證”按鈕后,會出現(xiàn)三種情況

1.點擊直接通過

在一段時間的前幾次登錄時,點擊按鈕,會直接通過驗證:

?

?

2.點擊出現(xiàn)滑動驗證碼

登錄幾次后,再次登錄時,就會出現(xiàn)滑動驗證碼:

?

?3.點擊出現(xiàn)點觸驗證碼:

登錄過多時,就會出現(xiàn)點觸驗證碼,這也是極驗最難的一種驗證碼:

?

?

?二、分析

利用Python的selenium模塊進(jìn)行自動登錄。

1.判斷是否通過驗證:

有一個類名為geetest_success_radar_tip的div標(biāo)簽,在加載后內(nèi)容為空,驗證成功后,內(nèi)容變?yōu)椤膀炞C成功”,可以通過其內(nèi)容來判斷,是否驗證成功。



下面是我截取的自己寫的一段代碼,主要是表達(dá)出含義,沒有截取所有代碼,理解就好:

self.success = self.browser.find_element_by_css_selector('.geetest_success_radar_tip') # 獲取顯示結(jié)果的標(biāo)簽def is_success(self):time.sleep(1)if self.success.text == "驗證成功":return Trueelse:return False

?

?

?2.點擊直接通過

在點擊“點擊驗證按鈕”后,對是否驗證成功進(jìn)行一次判斷,如果驗證通過,則可以進(jìn)行下一步動作。

3.滑動驗證

滑動驗證的標(biāo)簽是canvas,類名是geetest_canvas_slice,在點擊“點擊驗證”后,如果是滑動驗證,這個標(biāo)簽將會被加載,如果不是,則這個標(biāo)簽不會被加載。

所以可以通過查看是否存在這個標(biāo)簽,來判斷驗證是否是滑動驗證:

def is_slide(self):time.sleep(1)try:slie_img = self.browser.find_element_by_css_selector('canvas.geetest_canvas_slice')if slie_img:return slie_imgexcept NoSuchElementException:return False

?

如果是滑動驗證,則可以通過比對有缺口圖片和原圖片,從而確定缺口的位置,然后模擬滑動滑塊,從而達(dá)到驗證的目的。具體操作,我在上一篇隨筆中已經(jīng)寫過,請參考:
https://www.cnblogs.com/ohahastudy/p/11493971.html

4.點觸驗證

和滑動驗證類似,點觸驗證可以通過判斷是否存在類名為geetest_item_img的img標(biāo)簽來判斷該驗證為點觸驗證。

?

?

?

def is_pick(self):try:pick_img = self.browser.find_element_by_css_selector('img.geetest_item_img')return pick_imgexcept NoSuchElementException:return False

?


保存該圖片后,我們可以發(fā)現(xiàn),該圖片實際上是由兩部分組成:

?

?圖片中驗證碼的識別,我是通過超級鷹這個平臺來識別的。按照超級鷹的文檔,將圖片發(fā)過去,并指明類型,在幾秒之后會返回一個結(jié)果,內(nèi)容含有需要識別模塊的坐標(biāo),而其順序也是按照上圖中白色部分指定的順序,可以說是非常貼心了。

獲取坐標(biāo)后,將坐標(biāo)提取出來,然后通過模擬點擊即可。

三、具體實現(xiàn):

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from PIL import Image from six import BytesIO import time from selenium.webdriver import ActionChains from selenium.common.exceptions import NoSuchElementException import requests import chaojiying #超級鷹提供的模塊,需要去官網(wǎng)下載class Verifycode():def __init__(self):self.browser = webdriver.Chrome()def get_url(self, url, user, password):self.browser.get(url)self.browser.maximize_window()wait = WebDriverWait(self.browser, 10)wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_radar_btn')))user_input, pwd_input, *_ = self.browser.find_elements_by_css_selector('input.ivu-input')print(user_input)btn = self.browser.find_element_by_css_selector('.geetest_radar_btn')user_input.send_keys(user)pwd_input.send_keys(password)btn.click()time.sleep(1)self.success = self.browser.find_element_by_css_selector('.geetest_success_radar_tip') # 獲取顯示結(jié)果的標(biāo)簽def is_success(self):time.sleep(1)if self.success.text == "驗證成功":return Trueelse:return Falsedef get_position(self, img_label):location = img_label.locationsize = img_label.sizetop, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']return (left, top, right, bottom)def get_screenshot(self):screenshot = self.browser.get_screenshot_as_png()f = BytesIO()f.write(screenshot)return Image.open(f)def get_position_scale(self, screen_shot):height = self.browser.execute_script('return document.documentElement.clientHeight')width = self.browser.execute_script('return document.documentElement.clientWidth')x_scale = screen_shot.size[0] / (width + 10)y_scale = screen_shot.size[1] / (height)return (x_scale, y_scale)def get_slideimg_screenshot(self, screenshot, position, scale):x_scale, y_scale = scaleposition = [position[0] * x_scale, position[1] * y_scale, position[2] * x_scale, position[3] * y_scale]return screenshot.crop(position)def compare_pixel(self, img1, img2, x, y):pixel1 = img1.load()[x, y]pixel2 = img2.load()[x, y]threshold = 50if abs(pixel1[0] - pixel2[0]) <= threshold:if abs(pixel1[1] - pixel2[1]) <= threshold:if abs(pixel1[2] - pixel2[2]) <= threshold:return Truereturn Falsedef compare(self, full_img, slice_img):left = 65for i in range(full_img.size[0]):for j in range(full_img.size[1]):if not self.compare_pixel(full_img, slice_img, i, j):return ireturn leftdef get_track(self, distance):""" 根據(jù)偏移量獲取移動軌跡:param distance: 偏移量:return: 移動軌跡""" # 移動軌跡track = []# 當(dāng)前位移current = 0# 減速閾值mid = distance * 4 / 5# 計算間隔t = 0.2# 初速度v = 0while current < distance:if current < mid:# 加速度為正 2a = 4else:# 加速度為負(fù) 3a = -3# 初速度 v0v0 = v# 當(dāng)前速度 v = v0 + atv = v0 + a * t# 移動距離 x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 當(dāng)前位移current += move# 加入軌跡track.append(round(move))return trackdef move_to_gap(self, slider, tracks):""" 拖動滑塊到缺口處:param slider: 滑塊:param tracks: 軌跡:return:""" ActionChains(self.browser).click_and_hold(slider).perform()for x in tracks:ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.5)ActionChains(self.browser).release().perform()def is_slide(self):time.sleep(1)try:slie_img = self.browser.find_element_by_css_selector('canvas.geetest_canvas_slice')if slie_img:return slie_imgexcept NoSuchElementException:return Falsedef slide_code(self):slice_img_label = self.browser.find_element_by_css_selector('div.geetest_slicebg') # 找到滑動圖片標(biāo)簽self.browser.execute_script("document.getElementsByClassName('geetest_canvas_slice')[0].style['display'] = 'none'") # 將小塊隱藏full_img_label = self.browser.find_element_by_css_selector('canvas.geetest_canvas_fullbg') # 原始圖片的標(biāo)簽position = self.get_position(slice_img_label) # 獲取滑動驗證圖片的位置screenshot = self.get_screenshot() # 截取整個瀏覽器圖片position_scale = self.get_position_scale(screenshot) # 獲取截取圖片寬高和瀏覽器寬高的比例slice_img = self.get_slideimg_screenshot(screenshot, position, position_scale) # 截取有缺口的滑動驗證圖片self.browser.execute_script("document.getElementsByClassName('geetest_canvas_fullbg')[0].style['display'] = 'block'") # 顯示原圖screenshot = self.get_screenshot() # 獲取整個瀏覽器圖片full_img = self.get_slideimg_screenshot(screenshot, position, position_scale) # 截取原圖self.browser.execute_script("document.getElementsByClassName('geetest_canvas_slice')[0].style['display'] = 'block'") # 將小塊重新顯示left = self.compare(full_img, slice_img) # 將原圖與有缺口圖片進(jìn)行比對,獲得缺口的最左端的位置left = left / position_scale[0] # 將該位置還原為瀏覽器中的位置slide_btn = self.browser.find_element_by_css_selector('.geetest_slider_button') # 獲取滑動按鈕track = self.get_track(left) # 獲取滑動的軌跡self.move_to_gap(slide_btn, track) # 進(jìn)行滑動time.sleep(2)def is_pick(self):try:pick_img = self.browser.find_element_by_css_selector('img.geetest_item_img')return pick_imgexcept NoSuchElementException:return Falsedef pick_code(self):time.sleep(1)pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img') #獲取點觸圖片標(biāo)簽src = pick_img_label.get_attribute('src') #獲取點觸圖片鏈接img_content = requests.get(src).content #獲取圖片二進(jìn)制內(nèi)容f = BytesIO()f.write(img_content)img0 = Image.open(f) #將圖片以文件的形式打開,主要是為了獲取圖片的大小scale = [pick_img_label.size['width'] / img0.size[0], pick_img_label.size['height'] / img0.size[1]] #獲取圖片與瀏覽器該標(biāo)簽大小的比例cjy = chaojiying.Chaojiying_Client('*******', '******', '901489') #登錄超級鷹result = cjy.PostPic(img_content, '9005') #發(fā)送圖片并獲取結(jié)果if result['err_no'] == 0: #對結(jié)果進(jìn)行分析position = result['pic_str'].split('|') # position = ['110,234','145,247','25,185']position = [[int(j) for j in i.split(',')] for i in position] # position = [[110,234],[145,247],[25,185]]for items in position: #模擬點擊ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0],items[1] * scale[1]).click().perform()time.sleep(1)certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip')certern_btn.click()return cjy,resultif __name__ == '__main__':verifycode = Verifycode()verifycode.get_url('https://gtaccount.geetest.com/', '11', '11')if verifycode.is_success():print('success')elif verifycode.is_slide():verifycode.slide_code()if verifycode.is_success():print('slide success')else:print('slide failure')elif verifycode.is_pick():cjy,result = verifycode.pick_code()if verifycode.is_success():print('pick click success')else:print('pick click failure')if result['err_no'] == 0:r = cjy.ReportError(result['pic_id'])print(r)

?




?

轉(zhuǎn)載于:https://www.cnblogs.com/ohahastudy/p/11518256.html

總結(jié)

以上是生活随笔為你收集整理的爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91直接看| 精品久久蜜桃 | 91偷拍网站| 日韩91精品 | 看片在线 | 久久91av| 亚洲一二三区视频 | h成人在线 | 日韩精品在线观看免费 | 精品小视频 | 国产三级伦理片 | 午夜黄色福利视频 | 久久精品亚洲精品国产欧美 | avav我爱av| 日本zzjj| 亚洲av无码一区二区三区在线播放 | 欧美整片在线观看 | 97高清国语自产拍 | 国产老女人乱淫免费可以 | 日本在线观看一区二区 | 国产老女人精品毛片久久 | 97人人澡人人爽人人模亚洲 | 中文人妻熟女乱又乱精品 | av不卡网 | www99re| 国产高清精品软件丝瓜软件 | 精品一区日韩 | 久久99精品国产.久久久久 | 直接看的av | 久久久久久久久久久电影 | av女人的天堂 | 亚洲熟妇毛茸茸 | 国产嫩草av | 久久国产区 | 浮妇高潮喷白浆视频 | 丰满少妇毛片 | 日本少妇在线观看 | 亚洲免费在线视频观看 | 丝袜ol美脚秘书在线播放 | 国产 日韩 欧美 综合 | 日本a视频在线观看 | 国产精品入口66mio男同 | 亚洲精品在线影院 | 色小说在线 | 99re免费视频精品全部 | 久久免费精品视频 | 在线a视频 | 美女又爽又黄又免费 | 成人免费视频视频 | 欧美日韩精品一区二区三区四区 | 最新av片| 一区二区三区欧美 | 欧美整片sss | 涩视频在线观看 | 风间由美在线视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 成人免费视 | 日韩欧美一二三 | 久久精品人妻一区二区三区 | 91不卡在线 | 性色福利 | 国产免费黄色大片 | 在线观看羞羞漫画 | 久久精品在线免费观看 | 午夜精品久久久久久久99黑人 | 91爱爱影院 | 成人国产综合 | 午夜xxx| 国产九九热视频 | www.伊人.com| 桃色综合网 | 成人片在线播放 | 亚洲伦理一区 | 女王人厕视频2ⅴk | 国产又色又爽又黄 | 欧美 日韩 高清 | 中国黄色三级 | 天天干夜夜操视频 | 欧美日韩三级 | www.久久久久 | 森林影视官网在线观看 | 欧美丝袜视频 | 一区二区三区日韩精品 | 亚洲人成无码网站久久99热国产 | 日日网站 | 神马午夜嘿嘿 | 男受被做哭激烈娇喘gv视频 | 绝顶高潮videos合集 | 一区二区三区在线免费 | 中文字幕在线成人 | 成人亚洲国产 | 国产一区二区三区精品在线观看 | 99精品福利视频 | 在线观看免费黄色 | 男女激情网 | 91国在线啪| 欧美视频一区二区三区在线观看 | 日本v视频 | 天堂网avav|