前言:
🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证
📝📝第一篇文章《1.认识网络爬虫》获得全站热榜第一,python领域热榜第一。
🧾 🧾第四篇文章《4.网络爬虫—Post请求(实战演示)》全站热榜第八。
🧾 🧾第八篇文章《8.网络爬虫—正则表达式RE实战》全站热榜第十二。
🧾 🧾第十篇文章《10.网络爬虫—MongoDB详讲与实战》全站热榜第八,领域热榜第二
🧾 🧾第十三篇文章《13.网络爬虫—多进程详讲(实战演示)》全站热榜第十二。
🎁🎁《Python网络爬虫》专栏累计发表十四篇文章,上榜五篇。欢迎免费订阅!欢迎大家一起学习,一起成长!!
💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。
🧾 🧾网络爬虫是一种自动化程序,用于从Web页面中提取数据。然而,有些网站为了防止爬虫程序抓取数据,会加入一些验证码,使得程序无法自动化地完成数据采集任务。为了解决这个问题,我们可以使用selenium来破解验证码。
🧾 Selenium是一个开源的自动化测试工具,它可以模拟用户在浏览器中的操作,包括点击、输入等。使用selenium可以模拟用户手动输入验证码,从而实现验证码的破解。
首先我们介绍两个第三方破解平台:
第一款第三方打码平台是 :超级鹰
帮助开发者解决图像验证码的识别问题。它采用了最先进的图像识别技术,可以快速准确地识别各种形式的图像验证码,如数字、字母、中文、滑动拼图
第二款第三方平台是 :图灵
基于人工智能的定制化识别平台 可用于识别包括英数类型,中文类型,滑块类型等验证码,
🎯1.首先我们登录注册,方便我们后面使用
🎯2.选择我们需要的价格体系,待会也会用到
🎯3.Python语言Demo下载
🎯4.获取软件Key和软件ID
🧾 🧾主页如下,包含各种验证码识别:
🧾 识别接口说明
① 识别接口
② 识别请求参数说明
③ 识别返回结果说明
python API调用代码:
import base64 import json import requests # 复制以下代码,只需填入自己的账号密码、待识别的图片路径即可。 # 关于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位数字)") print(result)
到此为止,我们认识了两种用于破解验证码的平台,我们现在实战操作,方便大家理解学习。
🧾 我们来看一下我们的目标:
🎯1.使用selenium自动化登录目标网站
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.然后获取验证码的照片到本地,方便我们待会调用接口来破解。
img_code = driver.find_element(By.ID, 'imgCode') img_code.screenshot('img.png') # 保存成图片
🎯4.调用接口,来破解验证码。
from chaojiying import Chaojiying_Client chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '96001') # 用户中心>>软件ID 生成一个替换 96001 image = open('img.png', 'rb') # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str']) image.close() driver.find_element(By.ID, 'code').send_keys(pic_str)
🧾 🧾我们的目标就完成了,是不是很简单,后期把账号密码换成注册过的,就能实现自动登录和验证了。
完整代码:
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系统须要// pic_str = (chaojiying.PostPic(image.read(), 1004)['pic_str']) image.close() driver.find_element(By.ID, 'code').send_keys(pic_str) input()
🧾 我们来看一下我们的目标:
🎯1.思路和破解英数验证码一样,使用selenium自动打开网址,然后通过行为链点击到上图这个页面。
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秒,有数据就进行操作,没有就报错 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.然后我们对出现的验证码进行截图:
# 点击验证码位置,方便弹出验证码图框 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) # 休眠三秒,方便我们截图,防止验证码出现不及时 # 截图网页 driver.save_screenshot("html.png") # 剪切滑动部分 img = Image.open("html.png") # 剪切验证码的位置 图片的左上角和右下角 x和y轴 cropped = img.crop((563, 380, 1012, 608)) # 保存剪切的验证码照片 cropped.save("yzm.png")
🎯3.调用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.讲破解出的数据交给代码,让他帮助我们输入并且通过行为链来拖动滑块填充拼图,完成验证码的验证。
x = int(result['data']['滑块']['X坐标值']) q = int(result['data']['缺口']['X坐标值']) ranges = int((q - x) * 0.68) move_track = get_move_track(ranges) # 将结果交给滑动线性函数 # 滑动代码 element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw'))) # 滑块 ActionChains(driver).click_and_hold(element).perform() # 通过行为链,按住它,然后执行 for i in move_track: # 循环每次滑动的距离 # 执行移动 ActionChains(driver).move_by_offset(i, 0).perform() ActionChains(driver).release().perform() # 松开按键,完成滑动
运行结果:
智能无感知验证码_智能验证码_验证码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秒,有数据就进行操作,没有就报错 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) # 休眠三秒,方便我们截图,防止验证码出现不及时 # 截图网页 driver.save_screenshot("html.png") # 剪切滑动部分 img = Image.open("html.png") # 剪切验证码的位置 图片的左上角和右下角 x和y轴 cropped = img.crop((563, 380, 1012, 608)) # 保存剪切的验证码照片 cropped.save("yzm.png") # 调用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') # 输出滑块和缺口的位置参数 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) # 将结果交给滑动线性函数 # 滑动代码 element = wait.until(PE((By.CLASS_NAME, 'yidun_jigsaw'))) # 滑块 ActionChains(driver).click_and_hold(element).perform() # 通过行为链,按住它,然后执行 for i in move_track: # 循环每次滑动的距离 # 执行移动 ActionChains(driver).move_by_offset(i, 0).perform() ActionChains(driver).release().perform() # 松开按键,完成滑动 input()
📌📌使用selenium破解验证码需要模拟用户操作,包括手动输入验证码和提交表单等。验证码的设计越来越复杂,破解难度也越来越大。因此,在使用selenium破解验证码时,需要根据具体情况选择合适的方法。
👉👉本专栏所有文章是博主学习笔记,仅供学习使用,爬虫只是一种技术,希望学习过的人能正确使用它。
博主也会定时一周三更爬虫相关技术更大家系统学习,如有问题,可以私信我,没有回,那我可能在上课或者睡觉,写作不易,感谢大家的支持!!🌹🌹🌹