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

阅读: 评论:0

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

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

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

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

爬虫思路如下:

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

一.准备工作

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

二.爬虫构建

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

代码如下:

import requests
from hashlib import md5class Chaojiying(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = de('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: 题目类型 参考 .html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('.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('.php', data=params, headers=self.headers)return r.json()

2.初始化函数

def __init__(self):self.url = ''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.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(&#st_item_img')  # 获取点触图片标签src = pick__attribute('src')  # 获取点触图片链接img_content = (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(&#st_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.webdrivermon.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 = ''self.browser = webdriver.Chrome()self.browser.maximize_window()self.wait = WebDriverWait(self.browser, 20)self.username = USERNAMEself.password = PASSWORDdef open(self):"""打开网页输入用户名密码:return: None"""(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(&#st_item_img')  # 获取点触图片标签src = pick__attribute('src')  # 获取点触图片链接img_content = (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(&#st_commit_tip')certern_btn.click()return cjy, resultdef crack(self):"""破解入口:return: None"""self.open()self.pick_code()
if __name__ == '__main__':crack = CrackTouClick()ack()

四.GIF登录图

本文发布于:2024-02-05 01:51:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170721330961931.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:爬虫   验证码   实战   bilibili
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23