Python3爬虫实战【点触验证码】 — 模拟登陆bilibili

2023-12-01 18:30

本文主要是介绍Python3爬虫实战【点触验证码】 — 模拟登陆bilibili,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python3爬虫实战【点触验证码】 — 模拟登陆bilibili

爬虫时间:2020-08-30 请求链接:https://passport.bilibili.com/login 实现目标:模拟登陆哔哩哔哩
涉及知识:点触验证码的攻克、自动化测试工具 Selenium 的使用,超级鹰打码平台的使用
完整代码:https://github.com/dateolive/python-/tree/master/bilibili
学习过程中的爬虫GitHub库:https://github.com/dateolive/python-

爬虫思路如下:

  • 利用自动化爬虫工具 Selenium 模拟点击输入等操作来进行登录
  • 分析页面,获取点触验证码的点触图片,通过将图片发送给超级鹰打码平台识别后获取坐标信息
  • 根据超级鹰返回的数据,模拟坐标的点选,即可实现登录

一.准备工作

在开始之前,需要先注册一个超级鹰账号并申请一个软件ID,注册页面链接为:https://www.chaojiying.com/user/reg/,注册完成后需要在后台添加一个软件ID,进行充值获得积分,一般充一块钱就可以了。

二.爬虫构建

1.首先我可以到官方网站下载对应的 Python API,链接为:https://www.chaojiying.com/api-14.html ,我这里使用了崔庆才大大修改后的超级鹰api

代码如下:

import requests
from hashlib import md5class 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/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}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()

2.初始化函数

def __init__(self):self.url = 'https://passport.bilibili.com/login'self.browser = webdriver.Chrome()self.browser.maximize_window()self.wait = WebDriverWait(self.browser, 20)self.username = USERNAMEself.password = PASSWORD

这里定义了发起请求的url、用户名、密码等全局变量,实例化 Chrome 浏览器、设置浏览器分辨率最大化、用户名、密码、同时也设置等待超时

3.登录函数

def open(self):"""打开网页输入用户名密码:return: None"""self.browser.get(self.url)user = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))user.send_keys(self.username)password.send_keys(self.password)login_btn = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login')))# 随机暂停几秒time.sleep(random.random() * 3)# 点击登陆按钮login_btn.click()

等待账号输入框和密码输入框对应的 ID 节点加载出来,然后获取对应节点,其中账号输入框 id=“login-username”,密码输框
id=“login-passwd”,通过调用 send_keys() 方法输入账号和密码,接着获取登录按钮 class=“btn
btn-login”,设置暂停时间,最后调用 click() 方法实现登录按钮的点击。

4.点触验证码的处理

def pick_code(self):time.sleep(3)pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img')  # 获取点触图片标签src = pick_img_label.get_attribute('src')  # 获取点触图片链接img_content = requests.get(src).content  # 获取图片二进制内容f = BytesIO()f.write(img_content)img0 = Image.open(f)  # 将图片以文件的形式打开,主要是为了获取图片的大小scale = [pick_img_label.size['width'] / img0.size[0],pick_img_label.size['height'] / img0.size[1]]  # 获取图片与浏览器该标签大小的比例cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)result = cjy.post_pic(img_content, '9005')  # 发送图片并获取结果if result['err_no'] == 0:  # 对结果进行分析position = result['pic_str'].split('|')  # position = ['110,234','145,247','25,185']position = [[int(j) for j in i.split(',')] for i in position]  # position = [[110,234],[145,247],[25,185]]for items in position:  # 模拟点击ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0],items[1] * scale[1]).click().perform()time.sleep(1)time.sleep(2)# 点击登录certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip')certern_btn.click()return cjy, result

通过css选择器,找到点触图片的标签,获取图标的src链接,对图片处理发送给超级鹰后台并获取结果,对结果进行分析,模拟坐标的点选,即可实现登录。

三.爬虫完整代码

import random
import time
from io import BytesIO
import requests
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from chaojiying import ChaojiyingUSERNAME = 'b站账号'
PASSWORD = '密码'CHAOJIYING_USERNAME = '超级鹰账号'
CHAOJIYING_PASSWORD = '密码'
CHAOJIYING_SOFT_ID = 907581
CHAOJIYING_KIND = 9004class CrackTouClick():def __init__(self):self.url = 'https://passport.bilibili.com/login'self.browser = webdriver.Chrome()self.browser.maximize_window()self.wait = WebDriverWait(self.browser, 20)self.username = USERNAMEself.password = PASSWORDdef open(self):"""打开网页输入用户名密码:return: None"""self.browser.get(self.url)user = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))user.send_keys(self.username)password.send_keys(self.password)login_btn = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login')))# 随机暂停几秒time.sleep(random.random() * 3)# 点击登陆按钮login_btn.click()def pick_code(self):time.sleep(3)pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img')  # 获取点触图片标签src = pick_img_label.get_attribute('src')  # 获取点触图片链接img_content = requests.get(src).content  # 获取图片二进制内容f = BytesIO()f.write(img_content)img0 = Image.open(f)  # 将图片以文件的形式打开,主要是为了获取图片的大小scale = [pick_img_label.size['width'] / img0.size[0],pick_img_label.size['height'] / img0.size[1]]  # 获取图片与浏览器该标签大小的比例cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)result = cjy.post_pic(img_content, '9005')  # 发送图片并获取结果if result['err_no'] == 0:  # 对结果进行分析position = result['pic_str'].split('|')  # position = ['110,234','145,247','25,185']position = [[int(j) for j in i.split(',')] for i in position]  # position = [[110,234],[145,247],[25,185]]for items in position:  # 模拟点击ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0],items[1] * scale[1]).click().perform()time.sleep(1)time.sleep(2)# 点击登录certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip')certern_btn.click()return cjy, resultdef crack(self):"""破解入口:return: None"""self.open()self.pick_code()
if __name__ == '__main__':crack = CrackTouClick()crack.crack()

四.GIF登录图
在这里插入图片描述

这篇关于Python3爬虫实战【点触验证码】 — 模拟登陆bilibili的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.