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并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5