前言:
??????個人簡介:以山河作禮。
??????:Python領(lǐng)域新星創(chuàng)作者,CSDN實力新星認證
?????第一篇文章《1.認識網(wǎng)絡爬蟲》獲得全站熱榜第一,python領(lǐng)域熱榜第一
。
?? ??第四篇文章《4.網(wǎng)絡爬蟲—Post請求(實戰(zhàn)演示)》全站熱榜第八
。
?? ??第八篇文章《8.網(wǎng)絡爬蟲—正則表達式RE實戰(zhàn)》全站熱榜第十二
。
?? ??第十篇文章《10.網(wǎng)絡爬蟲—MongoDB詳講與實戰(zhàn)》全站熱榜第八,領(lǐng)域熱榜第二
?? ??第十三篇文章《13.網(wǎng)絡爬蟲—多進程詳講(實戰(zhàn)演示)》全站熱榜第十二
。
????《Python網(wǎng)絡爬蟲》專欄累計發(fā)表十四篇文章,上榜五篇。歡迎免費訂閱!歡迎大家一起學習,一起成長?。?br> ????悲索之人烈焰加身,墮落者不可饒恕。永恒燃燒的羽翼,帶我脫離凡間的沉淪。
一·selenium驗證碼破解
?? ??網(wǎng)絡爬蟲是一種自動化程序,用于從Web頁面中提取數(shù)據(jù)。然而,有些網(wǎng)站為了防止爬蟲程序抓取數(shù)據(jù),會加入一些驗證碼,使得程序無法自動化地完成數(shù)據(jù)采集任務。為了解決這個問題,我們可以使用selenium來破解驗證碼。
?? Selenium
是一個開源的自動化測試工具,它可以模擬用戶在瀏覽器中的操作,包括點擊、輸入等。使用selenium可以模擬用戶手動輸入驗證碼,從而實現(xiàn)驗證碼的破解。
二·破解平臺
首先我們介紹兩個第三方破解平臺:
第一款第三方打碼平臺是 :超級鷹
幫助開發(fā)者解決圖像驗證碼的識別問題。它采用了最先進的圖像識別技術(shù),可以快速準確地識別各種形式的圖像驗證碼,如數(shù)字、字母、中文、滑動拼圖
第二款第三方平臺是 :圖靈
基于人工智能的定制化識別平臺 可用于識別包括英數(shù)類型,中文類型,滑塊類型等驗證碼,
打碼平臺超級鷹文識別
-
超級鷹是一款第三方打碼平臺,可以幫助開發(fā)者解決圖像驗證碼的識別問題
。它采用了最先進的圖像識別技術(shù),可以快速準確地識別各種形式的圖像驗證碼,如數(shù)字、字母、中文、滑動拼圖等。 -
超級鷹提供了簡單易用的API接口,
開發(fā)者只需調(diào)用接口即可將驗證碼提交給超級鷹進行識別,并獲得識別結(jié)果
。此外,超級鷹還提供了多種識別方式,如手動識別、自動識別、多人協(xié)作等,可以滿足不同的識別需求。 - 超級鷹的圖文識別功能可以識別
包含文字
和圖片的驗證碼
,比如滑動拼圖驗證碼
。它可以先將驗證碼圖片拆分成多個小塊,再對每個小塊進行識別,最后將結(jié)果合并起來得到整個驗證碼的識別結(jié)果。這種識別方式可以大大提高驗證碼的識別準確率。
??1.首先我們登錄注冊,方便我們后面使用
??2.選擇我們需要的價格體系,待會也會用到
??3.Python語言Demo下載
??4.獲取軟件Key和軟件ID
基于人工智能的定制化識別平臺 —圖靈
?? ??主頁如下,包含各種驗證碼識別:
?? 識別接口說明
① 識別接口
② 識別請求參數(shù)說明
③ 識別返回結(jié)果說明
python API調(diào)用代碼:
import base64
import json
import requests
# 復制以下代碼,只需填入自己的賬號密碼、待識別的圖片路徑即可。
# 關(guān)于ID:選做識別的模型ID。
def b64_api(username, password, img_path, ID):
with open(img_path, 'rb') as f:
b64_data = base64.b64encode(f.read())
b64 = b64_data.decode()
data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
data_json = json.dumps(data)
result = json.loads(requests.post("http://www.tulingcloud.com/tuling/predict", data=data_json).text)
return result
if __name__ == "__main__":
img_path = r"C:/Users/Administrator/Desktop/file.jpg"
result = b64_api(username="你的賬號", password="你的密碼", img_path=img_path, ID="你選用的模型ID(8位數(shù)字)")
print(result)
到此為止,我們認識了兩種用于破解驗證碼的平臺,我們現(xiàn)在實戰(zhàn)操作,方便大家理解學習。
三·英文數(shù)字驗證碼破解
selenium破解驗證碼快捷登錄古詩文網(wǎng)
?? 我們來看一下我們的目標:
??1.使用selenium自動化登錄目標網(wǎng)站
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
driver.get(url)
??2.通過行為鏈,輸入賬號密碼,因為我沒有注冊,所以隨便輸入的,不過影響不大,我們需要的是輸入正確的驗證碼。
# 賬號輸入
driver.find_element(By.ID, 'email').send_keys('xxxxx')
# 密碼輸入
driver.find_element(By.ID, 'pwd').send_keys('xxxx')
??3.然后獲取驗證碼的照片到本地,方便我們待會調(diào)用接口來破解。
img_code = driver.find_element(By.ID, 'imgCode')
img_code.screenshot('img.png') # 保存成圖片
??4.調(diào)用接口,來破解驗證碼。
from chaojiying import Chaojiying_Client
chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '96001') # 用戶中心>>軟件ID 生成一個替換 96001
image = open('img.png', 'rb') # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統(tǒng)須要//
pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str'])
image.close()
driver.find_element(By.ID, 'code').send_keys(pic_str)
?? ??我們的目標就完成了,是不是很簡單,后期把賬號密碼換成注冊過的,就能實現(xiàn)自動登錄和驗證了。
完整代碼:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
driver.get(url)
# 賬號輸入
driver.find_element(By.ID, 'email').send_keys('xxxxx')
# 密碼輸入
driver.find_element(By.ID, 'pwd').send_keys('xxxx')
# 獲取驗證碼
img_code = driver.find_element(By.ID, 'imgCode')
img_code.screenshot('img.png') # 保存成圖片
from chaojiying import Chaojiying_Client
chaojiying = Chaojiying_Client('*****', '*****', ' 96001') # 用戶中心>>軟件ID 生成一個替換 96001
image = open('img.png', 'rb') # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統(tǒng)須要//
pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str'])
image.close()
driver.find_element(By.ID, 'code').send_keys(pic_str)
input()
四·滑動驗證碼破解
selenium滑動驗證碼破解網(wǎng)易網(wǎng)盾測試案例
?? 我們來看一下我們的目標:
??1.思路和破解英數(shù)驗證碼一樣,使用selenium自動打開網(wǎng)址,然后通過行為鏈點擊到上圖這個頁面。
service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.set_window_size(1100, 800) # 將瀏覽器窗口大小設置為寬1100像素,高800像素。
url = 'https://dun.163.com/trial/sense'
driver.get(url)
print(driver.page_source)
wait = WebDriverWait(driver, 20) # 等待20秒,有數(shù)據(jù)就進行操作,沒有就報錯
wait.until(PE((By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]'))).click() # 點擊可疑用戶-滑動拼圖
js = f'window.scrollTo(0,{300})'
driver.execute_script(js) # 將當前頁面滾動到垂直方向上300像素的位置。
??2.然后我們對出現(xiàn)的驗證碼進行截圖:
# 點擊驗證碼位置,方便彈出驗證碼圖框
wait.until(PE((By.XPATH,
'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]'))).click()
sleep(3) # 休眠三秒,方便我們截圖,防止驗證碼出現(xiàn)不及時
# 截圖網(wǎng)頁
driver.save_screenshot("html.png")
# 剪切滑動部分
img = Image.open("html.png")
# 剪切驗證碼的位置 圖片的左上角和右下角 x和y軸
cropped = img.crop((563, 380, 1012, 608))
# 保存剪切的驗證碼照片
cropped.save("yzm.png")
??3.調(diào)用ApI接口對截取的驗證碼進行識別
# api接口
def b64_api(username, password, img_path, ID): # 賬戶 密碼 照片 ID
with open(img_path, 'rb') as f:
b64_data = base64.b64encode(f.read())
b64 = b64_data.decode()
data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
data_json = json.dumps(data)
result = json.loads(requests.post("http://www.tulingtech.xyz/tuling/predict", data=data_json).text)
return result
??4.selenium 滑動線性 更加模擬人的行為進行點擊
# selenium 滑動線性 更加模擬人去操作
def get_move_track(gap):
track = [] # 移動軌跡
current = 0 # 當前位移
# 減速閾值
mid = gap * 4 / 5 # 前4/5段加速 后1/5段減速
t = 0.2 # 計算間隔
v = 0 # 初速度
while current < gap:
if current < mid:
a = 5 # 加速度為+5
else:
a = -5 # 加速度為-5
v0 = v # 初速度v0
v = v0 + a * t # 當前速度
move = v0 * t + 1 / 2 * a * t * t # 移動距離
current += move # 當前位移
track.append(round(move)) # 加入軌跡
return track
??5.講破解出的數(shù)據(jù)交給代碼,讓他幫助我們輸入并且通過行為鏈來拖動滑塊填充拼圖,完成驗證碼的驗證。
x = int(result['data']['滑塊']['X坐標值'])
q = int(result['data']['缺口']['X坐標值'])
ranges = int((q - x) * 0.68)
move_track = get_move_track(ranges) # 將結(jié)果交給滑動線性函數(shù)
# 滑動代碼
element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw'))) # 滑塊
ActionChains(driver).click_and_hold(element).perform() # 通過行為鏈,按住它,然后執(zhí)行
for i in move_track: # 循環(huán)每次滑動的距離
# 執(zhí)行移動
ActionChains(driver).move_by_offset(i, 0).perform()
ActionChains(driver).release().perform() # 松開按鍵,完成滑動
運行結(jié)果:
智能無感知驗證碼_智能驗證碼_驗證碼API_在線體驗
完整代碼:
import base64
import json
from time import sleep
import requests
from PIL import Image # pillow
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import presence_of_element_located as PE
from selenium.webdriver.support.ui import WebDriverWait
service = Service(executable_path='D:\chorm\chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.set_window_size(1100, 800) # 將瀏覽器窗口大小設置為寬1100像素,高800像素。
url = 'https://dun.163.com/trial/sense'
driver.get(url)
print(driver.page_source)
wait = WebDriverWait(driver, 20) # 等待20秒,有數(shù)據(jù)就進行操作,沒有就報錯
wait.until(PE((By.XPATH, '/html/body/main/div[1]/div/div[2]/div[2]/ul/li[2]'))).click() # 點擊可疑用戶-滑動拼圖
js = f'window.scrollTo(0,{300})'
driver.execute_script(js) # 將當前頁面滾動到垂直方向上300像素的位置。
# 點擊驗證碼位置,方便彈出驗證碼圖框
wait.until(PE((By.XPATH,
'/html/body/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]'))).click()
sleep(3) # 休眠三秒,方便我們截圖,防止驗證碼出現(xiàn)不及時
# 截圖網(wǎng)頁
driver.save_screenshot("html.png")
# 剪切滑動部分
img = Image.open("html.png")
# 剪切驗證碼的位置 圖片的左上角和右下角 x和y軸
cropped = img.crop((563, 380, 1012, 608))
# 保存剪切的驗證碼照片
cropped.save("yzm.png")
# 調(diào)用api接口對照片驗證碼進行識別
def b64_api(username, password, img_path, ID): # 賬戶 密碼 照片 ID
with open(img_path, 'rb') as f:
b64_data = base64.b64encode(f.read())
b64 = b64_data.decode()
data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
data_json = json.dumps(data)
result = json.loads(requests.post("http://www.tulingtech.xyz/tuling/predict", data=data_json).text)
return result
# 78915616
result = b64_api('****', '*****', "yzm.png", '78915616')
# 輸出滑塊和缺口的位置參數(shù)
print(result)
# selenium 滑動線性 更加模擬人去操作
def get_move_track(gap):
track = [] # 移動軌跡
current = 0 # 當前位移
# 減速閾值
mid = gap * 4 / 5 # 前4/5段加速 后1/5段減速
t = 0.2 # 計算間隔
v = 0 # 初速度
while current < gap:
if current < mid:
a = 5 # 加速度為+5
else:
a = -5 # 加速度為-5
v0 = v # 初速度v0
v = v0 + a * t # 當前速度
move = v0 * t + 1 / 2 * a * t * t # 移動距離
current += move # 當前位移
track.append(round(move)) # 加入軌跡
return track
x = int(result['data']['滑塊']['X坐標值'])
q = int(result['data']['缺口']['X坐標值'])
ranges = int((q - x) * 0.68)
move_track = get_move_track(ranges) # 將結(jié)果交給滑動線性函數(shù)
# 滑動代碼
element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw'))) # 滑塊
ActionChains(driver).click_and_hold(element).perform() # 通過行為鏈,按住它,然后執(zhí)行
for i in move_track: # 循環(huán)每次滑動的距離
# 執(zhí)行移動
ActionChains(driver).move_by_offset(i, 0).perform()
ActionChains(driver).release().perform() # 松開按鍵,完成滑動
input()
五·總結(jié)
????使用selenium破解驗證碼需要模擬用戶操作,包括手動輸入驗證碼和提交表單等。驗證碼的設計越來越復雜,破解難度也越來越大。因此,在使用selenium破解驗證碼時,需要根據(jù)具體情況選擇合適的方法。文章來源:http://www.zghlxwxcb.cn/news/detail-415066.html
六·后記
????本專欄所有文章是博主學習筆記,僅供學習使用,爬蟲只是一種技術(shù),希望學習過的人能正確使用它。
博主也會定時一周三更爬蟲相關(guān)技術(shù)更大家系統(tǒng)學習,如有問題,可以私信我,沒有回,那我可能在上課或者睡覺,寫作不易,感謝大家的支持?。??????文章來源地址http://www.zghlxwxcb.cn/news/detail-415066.html
到了這里,關(guān)于15.網(wǎng)絡爬蟲—selenium驗證碼破解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!