从新开始吧,而不是重新开始


哈喽,大家好呐,很久不见,甚是想念!

小夜斗又和大家见面啦,距离小夜斗上次更新爬虫文章又过去了很久辽!

因为在学校的时候有太多事情要做了,就疏忽了博客的更新呐,感觉以后还是要日常更新,知识需要输入,更需要输出,这样子才能吸收其中的精华所在!

趁这次暑假期间给自己充能的同时,给大伙们分享一下自己的学习项目,一方面可以加强自己对知识的印象,另一方面可以给大伙们做一个参考,这就是双赢呐!

本期小夜斗给大家伙带来的是一篇破解B站滑块验证实现自动登录的项目,仅供学习参考使用呐,切不可做违法乱纪的事情!

获取图片模块参考了这位大佬CoreJT的博客(感兴趣的小伙伴可以去阅读原作呐,Python爬虫实战 | (15) 破解bilibili登陆滑动验证码):

想要获取这个项目源码的小伙伴们文末自行获取呐!

一:破解滑块验证码项目所使用的库

from PIL import Image
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC, wait
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains  # 引入Action
import base64
  • from PIL import Image :对图像的基本处理
  • from selenium import webdriver:实例化浏览器对象实现自动化
  • from selenium.webdriver.support.wait import WebDriverWait :等待
  • from selenium.webdriver.support import expected_conditions as EC:等待条件
  • from selenium.webdriver.common.by import By:定位方式
  • import time:睡眠时间
  • from selenium.webdriver.common.action_chains import ActionChains:动作链,拖动滑块
  • import base64:处理图片,编码

二:初始化参数

class BliBli():def __init__(self, url, username, password):""":param url: 登录网址:param username:  账号:param password:  密码"""self.url = urlself.username = usernameself.password = password

上述代码中声明了一个BliBli类对象,初始化参数需要传入登录网址url,以及你的账号和密码,B站登录入口网址如下所示:

https://passport.bilibili.com/loginfrom_spm_id=333.851.top_bar.login_window

三:登录接口

    def login(self):"""模拟浏览器自动化插件配置,登录接口:return:"""# 浏览器对象path = r'L:\python package\jupyter learn record\Spider chong\chromedriver.exe'browser = webdriver.Chrome(path)# 登录browser.get(self.url)# 窗口最大化browser.maximize_window()# 账号密码接口wait = WebDriverWait(browser, 10)username = wait.until(EC.presence_of_element_located((By.ID, 'login-username')))password = wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))# 输入账号密码username.send_keys(self.username)password.send_keys(self.password)# 点击登录按钮# TODO: 登录没反应login_press = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="geetest-wrap"]/div/div[5]/a[1]')))print("正在点击登录按钮")login_press.click()print("登录按钮点击完毕")# 停顿time.sleep(1000)

这个login函数是登录接口一部分代码,因为还有一部分牵扯到另一些函数接口,就没有全部弄上来了,下文会给大家伙展示!

首先我们实例化了一个浏览器对象browser,用它模拟人来实现自动登录,首先输入账号,然后密码,点击登录!



在输入账号密码点击登录后,会弹出来一个滑动验证码,这时你需要通过移动相应的图形到对应的缺口,如下图所示:

四:破解滑动验证核心模块

小夜斗个人感觉这个滑动验证模块其实没有那么难,我们所需要做的事情无非就是计算这个滑块到那个缺口所需要移动的距离,然后用浏览器模拟人去拖动就行了,然后最关键的地方,拖动到最后我们人为都是会停留一段时间的,想象一下你自己拖动模块时的感受,是不是很快的拖动过去,然后在停留1s到2s左右,最后都是能验证成功的!

那如何计算我们滑块所需要移动的距离呢?

我们先来看下面三张滑块验证图片,如下图所示:

第一张:即包含缺口又包含移动滑块


第二张:只包含缺口


第三张:一副完整的验证图片


很简单的思路:我只需要将第二张和第三张图片像素点进行对比,设置一个误差范围阙值,这样子是不是就可以知道缺口的大致位置

而且我们拖动滑动是左右拖动,因此我们只需要获取其x轴方向的位置即可

(一):首先我们来获取上述的三张图片

    def get_screen_image(self, wait, browser):# 带阴影的图片im = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_canvas_bg')))time.sleep(2)im.screenshot('./image1.png')# 执行JS代码并拿到base64数据# 不带阴影的完整图片JS = 'return document.getElementsByClassName("geetest_canvas_fullbg")[0].toDataURL("image/png");'# 获取图片信息im_info = browser.execute_script(JS)print(im_info)# 拿到base64编码的图片信息im_base64 = im_info.split(',')[1]print(im_base64)# 转为bytes类型captcha_1 = base64.b64decode(im_base64)# 保存图片with open('captcha_1.png', 'wb') as f:f.write(captcha_1)# 执行JS代码并拿到图片base64数据# 带阴影的图c_js = 'return document.getElementsByClassName("geetest_canvas_bg")[0].toDataURL("image/png");'im_info_1 = browser.execute_script(c_js)print(im_info_1)# 拿到base64编码的图片信息im_base64_1 = im_info_1.split(',')[1]# 转为bytes类型captcha_2 = base64.b64decode(im_base64_1)# 将图片保存在本地with open('captcha_2.png', 'wb') as f:f.write(captcha_2)captcha1 = Image.open('./captcha_1.png')captcha2 = Image.open('./captcha_2.png')return captcha1, captcha2

当滑块验证码弹出来,按f12检查元素,可以分别看到属性:


然后执行相应的JS代码拿到对应的图片,进行切割编码,将图片进行保存,用于后续的像素对比操作!

小夜斗在看滑块标签属性的时候发现:display属性后面的block改为none滑块为消失,另一个标签的none改为block缺口为消失,还有一个none改为block滑块和缺口都消失



(二):像素对比,寻找缺口位置

    def position(self, image1, image2):# 缺口离左侧的位置left = 60# x轴方向for i in range(left, image1.size[0]):# y轴方向for j in range(image1.size[1]):if not self.pixel_euqal(image1, image2, i, j):left = i  # 找到缺口左边边界在x轴方向上的位置return leftreturn left

函数position功能是寻找缺口的x轴位置,传入参数image1image2分别为不带缺口的图片只带缺口的图片,为上述的第二张图和第三张图

我们定义了一个参数left,即缺口离最左侧的距离(人为的初始化一个距离,一定为60或者0都是可以的),x轴方向像素变量,y轴方向像素遍历,然后我们调用pixel_euqal函数来比对两张图片image1与image2,从而找到缺口对应的x轴位置赋值给left,最终返回left即滑块所需移动的x轴位置

    def pixel_euqal(self, image1, image2, x, y):# 获取两张图片像素点pixel1 = image1.load()[x, y]pixel2 = image2.load()[x, y]# 设置一个误差阙值threshold = 60# 每个位置的像素点有三个通道if (abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold andabs(pixel1[2] - pixel2[2]) < threshold):return Trueelse:return False

(三)拖动滑块,完成自动登录

    def drag(self, browser, wait, gap):"""拖动滑块方法:return:"""# 定位圆形滑块的位置circle = wait.until(EC.presence_of_element_located((By.XPATH,'/html/body/div[2]/div[2]/div[6]/div/div[1]/div[2]/div[2]')))print(circle)# 拖到某个位置后松开# TODO:方法需要perform执行print("开始拖动滑块")ActionChains(browser).click_and_hold(circle).perform()# for i in track:#     ActionChains(browser).move_by_offset(i, 0).perform()ActionChains(browser).move_by_offset(gap, 0).perform()time.sleep(1)print("滑块移动结束")ActionChains(browser).release().perform()

定义了一个drag拖拉的方法,首先找到对应的原型滑块位置circle,然后用动作链去移动circle对象,我们移动的时候并不需要先加速后减速,直接移动过去即可,因为网站后台检测的是你最后的停留时间,如果你按照先快后慢那种移动,成功率还没有直接移过去然后停留一秒来的快

想象一下我们人是怎么移的,直接移过去,然后停留一下,同样的道理放在浏览器对象也是一样的

哦对了,缺口移动的位置left,还需要根据你自己的调整减去一个参数,这里小夜斗调整的参数为10,即滑块自己本身的大小,根据移动的需求人工微调即可,下面为login函数后半部分代码

        # TODO: 获取两张验证码图片captcha1, captcha2 = self.get_screen_image(wait, browser)# TODO: 缺口位置如何寻找?left = self.position(captcha1,captcha2)left = left - 10print(left)# TODO: 如何拖动滑块?self.drag(browser, wait, left)# 停顿time.sleep(1000)

本期博客就到此啦,感兴趣的小伙伴们不烦点赞收藏一波!

源码数据:关注微信公众号"夜斗小神社"后台回复"008滑块验证"

- 在这个星球上,你很重要,请珍惜你的珍贵! ~~~夜斗小神社

【原来Python爬虫还可以这么玩!】python爬虫自动化实现B站自动登录相关推荐

  1. python的坏处_六星教育:爬虫还分好坏?恶意爬虫到底会给你生活造成多大危害?...

    原标题:六星教育:爬虫还分好坏?恶意爬虫到底会给你生活造成多大危害? 随着互联网的兴起,数据时代的来临,Python越来越受到人们的重视,六星教育对此开设了Python课程,以帮助更多同学提升技能.不 ...

  2. python除了爬虫还做什么_python除了爬虫还可以做什么

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发.除了爬虫还可 ...

  3. 全民一起玩python课件_全民一起玩Python课基础+提高篇[免费学习]

    全民一玩Python系列由杨洋博士精心制作,面向所有希望学习Python编程.进而能够在学习和工作中编写办公自动化.网页信息提取.数据分析处理.人工智能应用.娱乐游戏应用等实用程序的各行业人士. 制作 ...

  4. python编程教学基本语法教学视频_Python编程学习#Python视频课程#全民一起玩Python 基础+提高...

    适用人群 想用轻松系统的方式,从零开始真正理解掌握Python.进而学习办公.网抓.数据.AI.网站等技术的各界人士 课程概述 制作精细.自带吐槽,每节课程(20分钟)均耗时数十小时精心打造!有多达十 ...

  5. 全民一起玩python视频_全民一起玩Python之基础篇,视频教程下载

    课程介绍: "全民一玩Python"系列由杨洋博士精心制作,面向所有希望学习Python编程.进而能够在学习和工作中编写办公自动化.网页信息提取.数据分析处理.人工智能应用.娱乐游 ...

  6. 手机可以玩python吗_在手机上玩python编程-Pydroid3

    手机屏幕太少,写代码不方便,建议用电脑学习python 有时候,就是不想正襟危坐的坐在电脑前面,想要在手机上轻量级的写点代码. 安卓软件推荐 Pydroid.3 Pydroid 3免费高级版app是一 ...

  7. python笑傲江湖_ensp模拟器上玩python编程自动化(入门)

    1.安装python3.Geany编辑器和Paramiko模块 1.1安装python 官网下载https://www.python.org/ 或其他下载站点下载后安装python3,安装时选择创建环 ...

  8. Python 高手都是怎么玩转 Excel 自动化的

    在日常的工作中,对 Excel 的操作必不可少,如果涉及到大量的 Excel 操作的话,手动处理效率还是比较低的,因此 Excel 自动话完全有必要,今天派森酱就和大家分享一下如何利用 Python ...

  9. 震精~python运算符还能这么玩~到底这么做到的?神级程序员解密!

    运算符是可以操纵操作数值的结构.如下一个表达式:10 + 20 = 30.这里,10和20称为操作数,+则被称为运算符. 运算符类型 Python语言支持以下类型的运算符 - 1.算术运算符 2.比较 ...

最新文章

  1. 使用NMAKE管理工程
  2. java 操作oracle 源码_java对oracle的常用操作示例源码
  3. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享
  4. linux 产生三位数的随机数
  5. JAVA多线程和并发
  6. 数据结构上机测试2-1:单链表操作A
  7. 提权命令_利用Linux文本操作命令ed进行提权
  8. 【VB.NET】测验题目Quiz1
  9. VC 对话框背景颜色 控件颜色
  10. Multi-statement transaction required more than ‘max_binlog_cache_size‘ bytes of storage
  11. 316.去除重复字母
  12. 互联网产品经理,全方位入门,图书推荐
  13. mysql常用增删改查sql语句
  14. Python+OpenCV 调用手机摄像头并实现人脸识别
  15. 多线程与 “锁”
  16. python processpoolexecutor_理解Python的PoolExecutor
  17. add p4 多个文件_在P4存储库中查找add/delete/checkout/checkin文件中的p4perl示例代码
  18. 数据技术初学者不用再东搜西找了,一篇文章解读20个最新数据技术概念
  19. vue3 引入天地图
  20. 其他国家的近现代教育制度

热门文章

  1. 关于顺序栈的退栈和入栈操作
  2. 2020下半年新机最新消息_2020下半年预计会有哪些手机发布?
  3. Java面向对象那些事之抽象类、接口
  4. 基于MPEG-4的视频压缩基础
  5. 苹果6s参数_很像苹果的默认壁纸
  6. codeforces 855C 树DP
  7. iPhone降频门:谁的傲慢与偏见
  8. c++编写一个简单的Http服务器
  9. 微信dat文件用什么软件打开,如何转成jpg常用格式
  10. Linux提权之Suid提权 小部分归纳