Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能


Posted in Python onDecember 21, 2020

写在前面

  今天带给大家一个突破点选验证码的案例,利用爬虫模拟登陆哔哩哔哩,并且把一些采坑的地方给大家强调一下,避免大家想我一样(唉,菜鸡本菜)还是老规矩在文末会附上完整代码,需要的小伙伴自取就好了,能帮助到你的话别忘了点赞关注喔~

  郑重声明:本人目前仅在CSDN这一个平台发布文章,其他小伙伴如果想转载 或者引用请注明引用来源,未经许可不得直接搬运,请尊重创作人的劳动成果,谢谢!

Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

一、需求分析

  模拟登陆哔哩哔哩

  网站链接: https://passport.bilibili.com/login

效果图如下:

Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

验证成功后会自动跳转B站的登录界面,为了保护我的信息安全,我用了假用户名,当然如果各位小伙伴非常想加我的话,欢迎私聊加VX喔((✿◡‿◡))

二、编程思路

  首先利用xpath或者css选择器等方法找到要输入内容的元素位置,然后用自动化爬虫工具Selenium模拟点击输入等操作来进行登录并分析页面,获取点选验证码的点选图片,通过将图片发送给快识别打码平台识别后获取坐标信息,根据快识别返回的数据,模拟坐标的点选,即可实现登录。

三、前期准备

1.下载chrome driver

  就是下载谷歌浏览器的驱动器,当然如果你用其他浏览器那么就要下载其他浏览器的相应驱动,这里我以chrome浏览器为例,为什么要用英文呢?啊,这还用问当然是为了洋气啦!(手动狗头)
  下载驱动的时候必须要下载相应的版本,可以在浏览器上方输入chrome://version,即可查看自己的chrome版本。

Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

然后进入 https://npm.taobao.org/mirrors/chromedriver/网站下载相应版本的驱动。

2.安装selenium库

  由于是第三方库,所以在使用selenium之前需要先安装:

pip install selenium

安装的时候建议大家换镜像源,具体方法可以参考这篇文章
链接: https://3water.com/article/202564.htm

3.对接打码平台

  根据我们前面的编程思路我们需要到快识别网站http://www.kuaishibie.cn/根据给出的开发文档和我们所需要的打码功能构建一个自己的api。

代码如下:

#快识别网址 http://www.kuaishibie.cn/
#interface
import base64
import json
import requests

def base64_api(uname,pwd,img):
 '''
 验证码识别接口
 :param uname: 快识别用户名
 :param pwd: 快识别密码
 :param img: 图片路径
 :return: 返回识别结果
 '''
 with open(img, 'rb') as f:
 base64_data = base64.b64encode(f.read())
 b64 = base64_data.decode()
 data = {"username": uname, "password": pwd, "image": b64,"typeid":21}
 #result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)
 result = json.loads(requests.post("http://api.ttshitu.com/imageXYPlus", json=data).text)
 if result['success']:
 return result["data"]["result"]
 else:
 return result["message"]

三、完整代码

  代码中的一些难点和相关步骤我都做了注释,根据上面给出的编程思路大家一步一步做就好了,我就不再详细解释了,如果任何问题欢迎评论区提问或者私信我都可以喔~

#login_bilibili
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver import ActionChains #导入动作链模块


KUAI_USERNAME = '快识别账号'
KUAI_PASSWORD = '快识别密码'

USERNAME = 'B站账号'
PASSWORD = 'B站密码'

#创建浏览器对象
driver = webdriver.Chrome(executable_path='chromedriver.exe')
#打开请求网页页面
driver.get('https://passport.bilibili.com/login')
driver.implicitly_wait(10) #隐式等待浏览器渲染完成,sleep是强制等待
#driver.execute_script("document.body.style.zoom='0.67'") #浏览器内容缩放67%
driver.maximize_window()#最大化浏览器

'''
用selenium自动化工具操作浏览器,操作的顺序和平常用浏览器操作的顺序是一样的
'''

'''
找到用户名和密码框输入密码
'''
user_input = driver.find_element_by_xpath('//*[@id="login-username"]') #使用xpath定位用户名标签元素
user_input.send_keys(USERNAME)
time.sleep(1)

user_input = driver.find_element_by_xpath('//*[@id="login-passwd"]') #用户密码标签
user_input.send_keys(PASSWORD)
time.sleep(1)

#点击登录
Login_input = driver.find_element_by_css_selector('#geetest-wrap > div > div.btn-box > a.btn.btn-login')
Login_input.click()
time.sleep(5)

#对图片验证码进行提取
img_label = driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div') #提取图片标签

#保存图片
driver.save_screenshot('big.png') #截取当前整个页面
time.sleep(5)
#location可以获取这个元素左上角坐标
print(img_label.location)
#size可以获取这个元素的宽(width)和高(height)
print(img_label.size)

#计算验证码的左右上下横切面
left = img_label.location['x']
top = img_label.location['y']
right = img_label.location['x'] + img_label.size['width']
down = img_label.location['y'] + img_label.size['height']

im = Image.open('big.png')
im = im.crop((left,top,right,down))
im.save('yzm.png')

#对接打码平台
from interface import base64_api #显示报错也无妨,可以运行的不要被唬住

img_path = 'yzm.png'
result = base64_api(uname=KUAI_USERNAME, pwd=KUAI_PASSWORD, img=img_path)
print(result)
print('验证码识别结果:', result)
result_list = result.split('|')
for result in result_list:
 x = result.split(',')[0]
 y = result.split(',')[1]
 ActionChains(driver).move_to_element_with_offset(img_label, int(x), int(y)).click().perform() # perform()执行整个动作链

#点击确认按钮
driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()
input() # 用户输入 阻塞浏览器关闭
# 关闭浏览器
driver.quit()

注:chrome driver一定要和项目文件放在一起,这样更加方便也更稳定。interface接口文件最好也喝项目文件在一起,方便import导入

Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

  然后就可以自动登录到B站啦,还在等什么,赶紧试试吧~

引用源自

B站Python学习者 链接:https://www.bilibili.com/video/BV1qJ411S7F6

到此这篇关于Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能的文章就介绍到这了,更多相关Python爬虫登陆哔哩哔哩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python循环语句之break与continue的用法
Oct 14 Python
python编写简单爬虫资料汇总
Mar 22 Python
Python环境变量设置方法
Aug 28 Python
Python在图片中添加文字的两种方法
Apr 29 Python
python中logging库的使用总结
Oct 18 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
Python selenium的基本使用方法分析
Dec 21 Python
pytorch+lstm实现的pos示例
Jan 14 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
java关于string最常出现的面试题整理
Jan 18 Python
python switch 实现多分支选择功能
Dec 21 #Python
selenium自动化测试入门实战
Dec 21 #Python
django中ImageField的使用详解
Dec 21 #Python
python文件路径操作方法总结
Dec 21 #Python
Python爬虫新手入门之初学lxml库
Dec 20 #Python
Python修改DBF文件指定列
Dec 19 #Python
Python实现FTP文件定时自动下载的步骤
Dec 19 #Python
You might like
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
javascript数组去重小结
2016/03/07 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
从Python程序中访问Java类的简单示例
2015/04/20 Python
Python标准库defaultdict模块使用示例
2015/04/28 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python实现的计数排序算法示例
2017/11/29 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python实现flappy bird游戏
2018/12/24 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python笔记之工厂模式
2019/11/20 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
企业员工集体活动方案
2014/08/17 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
优秀党支部申报材料
2014/12/24 职场文书
先进工作者个人总结
2015/02/15 职场文书
期中考试后的感想
2015/08/07 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电
Oracle中日期的使用方法实例
2022/07/07 Oracle