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制作动态字符图的实例
Jan 27 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python实现人工智能Ai抠图功能
Sep 05 Python
python解析多层json操作示例
Dec 30 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
python两种获取剪贴板内容的方法
Nov 06 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
php microtime获取浮点的时间戳
2010/02/21 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
Python 高效编程技巧分享
2020/09/10 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
幼儿教师考核制度
2014/01/25 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
公务员检讨书
2014/11/01 职场文书
丧事答谢词
2015/01/05 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL