Python爬虫实战 | (16) 破解简书登录点触验证码

2023-11-09 18:58

本文主要是介绍Python爬虫实战 | (16) 破解简书登录点触验证码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本篇博客中,我们将使用selenium模拟登录简书网站,破解其登陆时的滑动验证码。

我们需要使用验证码识别服务平台。超级鹰,来帮助我们破解点触验证码。下面的chaojiying.py文件用于调用超级鹰服务,帮助我们破解点触或图片验证码,直接照搬就好了:

import requests
from hashlib import md5#使用超级鹰来进行图片验证码和点触验证码的识别
class Chaojiying(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',}def post_pic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,headers=self.headers)return r.json()def report_error(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

程序主体框架:

from selenium import  webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException
from JianShuLogin.chaojiying import Chaojiying
import time
from PIL import Image
from io import BytesIO#简书用户名、密码
USERNAME = ''
PASSWARD = ''
#超级鹰用户名、密码、软件ID(需要注册)
CHAOJIYING_USERNAME = ''
CHAOJIYING_PASSWORD = ''
CHAOJIYING_SOFT_ID = 
CHAOJIYING_KIND = 9004 #验证码类型 用于破解点触验证码 具体可见官网class JianShuLogin():def __init__(self):self.url = 'https://www.jianshu.com/sign_in'self.browser = webdriver.Chrome()# 显示等待self.wait = WebDriverWait(self.browser, 20)self.username = USERNAMEself.password = PASSWARDself.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)def __del__(self):self.browser.close()def login_successfully(self):passdef touch_click_verify(self):passdef touch_click_words(self,locations):passdef get_points(self,captcha_result):passdef get_touclick_element(self):passdef get_touclick_image(self,name='captcha.png'):passdef get_login_btn(self):passdef open(self):passdef login(self):"""破解入口:return:"""#打开登陆界面 输入用户名和密码self.open()#找到登陆按钮button = self.get_login_btn()#点击button.click()#获取点触验证码图片image = self.get_touclick_image()bytes_array = BytesIO()image.save(bytes_array, format='PNG')# 识别验证码result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)print(result)# 获取点击的位置locations = self.get_points(result)# 依次进行点击self.touch_click_words(locations)# 找到并点击确认按钮self.touch_click_verify()# 判断是否成功if self.login_successfully():print('登录成功')else:  # 可能不成功 重来self.chaojiying.report_error(result['pic_id'])self.login()if __name__ == '__main__':login = JianShuLogin()login.login()

打开网页,输入用户名和密码:

  def open(self):"""打开网页输入用户名和密码:return: None"""self.browser.get(self.url)# 找到用户名输入框'''<input placeholder="手机号或邮箱" type="text" name="session[email_or_mobile_number]" id="session_email_or_mobile_number">'''username = self.wait.until(EC.presence_of_element_located((By.ID, 'session_email_or_mobile_number')))# 找到密码输入框'''<input placeholder="密码" type="password" name="session[password]" id="session_password">'''passward = self.wait.until(EC.presence_of_element_located((By.ID, 'session_password')))# 输入用户名和密码username.send_keys(self.username)passward.send_keys(self.password)

找到登录按钮:

    def get_login_btn(self):"""找到登陆按钮:return:"""'''<button class="sign-in-button" id="sign-in-form-submit-btn" type="button"><span id="sign-in-loading"></span>登录</button>'''button = self.wait.until(EC.element_to_be_clickable((By.ID,'sign-in-form-submit-btn')))return button

获取点触验证码图片:

    def get_touclick_element(self):"""获取验证图片元素:return: 图片元素"""# 获取整个验证图片'''<div class="geetest_holder geetest_silver" style="width: 100%; display: block; opacity: 1;"><div class="geetest_widget"><div class="geetest_head"><div class="geetest_tips"><div class="geetest_tip_content">请在下图<span class="geetest_mark">依次</span>点击:</div><div class="geetest_tip_img" aria-hidden="true" style="display: block; background-image: url(&quot;https://static.geetest.com/nerualpic/word_l1_zh_2019.06.10/starry_night/11765df8573a797e0c5951eb781ab68f.jpg?challenge=628d53ef8ff2f9c9a4b006f103d60067&quot;); width: 116px; height: 40px; right: -116px; top: -10px;"></div></div><div class="geetest_atips"><div class="geetest_atip_content"></div><div class="geetest_tip_text"><div class="geetest_word1"><span class="">1</span></div><div class="geetest_word2"><span class="">2</span></div><div class="geetest_word3"><span class="">3</span></div><div class="geetest_word4"><span class="">4</span></div><div class="geetest_word5"><span class="">5</span></div><div class="geetest_word6"><span class="">6</span></div></div></div><div class="geetest_tip_space"></div></div><div class="geetest_table_box"><div class="geetest_window"><div class="geetest_item geetest_big_item" style="width: 95.8%; padding-bottom: 95.8%;"><div class="geetest_item_loading"><div class="geetest_item_loading_icon"></div><div class="geetest_item_loading_tip">加载中...</div></div><div class="geetest_item_wrap"><img class="geetest_item_img" aria-hidden="true" src="https://static.geetest.com/nerualpic/word_l1_zh_2019.06.10/starry_night/11765df8573a797e0c5951eb781ab68f.jpg?challenge=628d53ef8ff2f9c9a4b006f103d60067" style="right: 0px; top: 0px; width: 100%; height: 112%;"></div></div></div><div class="geetest_result_tip"></div></div><div class="geetest_panel"><div class="geetest_small" tabindex="-1" style="outline: none; font-size: 12px;"><a class="geetest_close" href="javascript:;" tabindex="-1"><div class="geetest_close_tip">关闭验证</div></a><a class="geetest_refresh" href="javascript:;" tabindex="-1"><div class="geetest_refresh_tip">刷新验证</div></a><a class="geetest_feedback" tabindex="-1" style="display: none;"><div class="geetest_feedback_tip">帮助反馈</div></a><a class="geetest_voice"><div class="geetest_voice_tip"></div></a></div><a class="geetest_commit" href="javascript:;"><div class="geetest_commit_tip">确认</div></a></div></div></div>'''element = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.geetest_holder')))return elementdef get_touclick_image(self,name='captcha.png'):"""获取点触验证码图片:param name::return: 图片对象"""im = self.get_touclick_element()time.sleep(2)im.screenshot('captcha_.png')captcha = Image.open('captcha_.png')print(im.size)# 改变截图的大小 和原图一致captcha = captcha.resize((im.size['width'], im.size['height']))captcha.save('captcha_resize.png')return captcha

解析超级鹰识别结果,获取点击坐标:

 def get_points(self,captcha_result):"""解析识别结果:param captcha_result: 识别结果:return:转换后的结果"""# 获取点击的坐标groups = captcha_result.get('pic_str').split('|')locations = [[int(number) for number in group.split(',')] for group in groups]return locations

根据坐标,点击验证图片:

 def touch_click_words(self,locations):"""点击验证图片:param locations: 点击位置:return:"""for location in locations:print(location)ActionChains(self.browser).move_to_element_with_offset(self.get_touclick_element(), location[0],location[1]).click().perform()time.sleep(1)

最后点击确认按钮:

 def touch_click_verify(self):"""点击确认按钮:return:"""'''<div class="geetest_commit_tip">确认</div>'''button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_commit_tip')))button.click()

判断登录是否成功,如果成功,会有一个写文章按钮:

    def login_successfully(self):"""判断登陆是否成功:return:"""'''<a class="btn write-btn" target="_blank" href="/writer#/"><i class="iconfont ic-write"></i>写文章
</a>'''try:return bool(WebDriverWait(self.browser,5).until(EC.presence_of_element_located((By.CSS_SELECTOR,'.write-btn'))))except TimeoutException:return  False

完整项目

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于Python爬虫实战 | (16) 破解简书登录点触验证码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377983

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10