Python爬虫进阶——案例:模拟bilibili登录)

主要内容:模拟bilibili账号密码登录,不要实现的的实现功能是单击登录按钮,切换登录方式, 输入账号和密码,然后完成图片点击验证,最后单击立即登录按钮。

1、第一步:通过selenium模块访问bilibili的登录页面,定位并单击账号登陆按钮,然后分别定位账号和密码输入框,并输入账号和密码。

2、第二步:识别图片中图形的位置。

3、第三步:进行按照图形识别顺序进行点击。

4、第四步:点击确认标签。

python 复制代码
##############################
##作者:白雪公主的后妈
##时间:2024年1月12日
##主题:Python爬虫进阶------案例:模拟bilibili登录
##主要内容:模拟bilibili登录
##############################
'''
模拟bilibili账号密码登录,不要实现的的实现功能是单击登录按钮,切换登录方式,
输入账号和密码,然后完成图片点击验证,最后单击立即登录按钮
'''
#第一步:通过selenium模块访问bilibili的登录页面,定位并单击账号登陆按钮,然后分别定位账号和密码输入框,并输入账号和密码。
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
#################################
import base64
import json
import requests
import pandas as pd
#################################
# from PIL import Image
service = Service('E:\\python\\Scripts\\chromedriver.exe')      #实例化一个谷歌浏览器
browser = webdriver.Chrome(service=service)
browser.get('https://www.bilibili.com/')   #访问bilibili的登录页面                           #访问淘宝网页首页

login_user_page = browser.find_element(By.XPATH,'//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div/div/span')      #通过XPath表达式定位'账号登陆'按钮
login_user_page.click()             #单击账号登录按钮
time.sleep(2)
username_input = browser.find_element(By.XPATH,'//*[@class="login-pwd-wp"]/form/div[1]/input')        #通过标点ID定位账号输入框
password_input = browser.find_element(By.XPATH,'//*[@class="login-pwd-wp"]/form/div[3]/input')        #通过标点ID定位密码输入框
username_input.send_keys('123456')          #在账号框中输入123456
time.sleep(2)                               #停留两秒,模拟真是人类操作
password_input.send_keys('234567')          #在密码框中输入234567
login_button = browser.find_element(By.XPATH,'//*[@class="btn_primary "]')      #通过XPath表达式定位'登陆'按钮
login_button.click()             #单击账号登录按钮
time.sleep(2)

#第二步:识别图片中图形的位置
#############################
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, "typeid": 21, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        # !!!!!!!注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别
        return result["message"]
#############################

# 解决验证码自动识别问题
Img_input = browser.find_element(By.XPATH,'//*[@class="geetest_holder geetest_silver"]')
Img_input.screenshot('yzm.png')

#对图片进行解码,获取验证码识别以后的结果
result = base64_api('XXXX','XXXX','yzm.png')
# print('验证码识别结果:',result)      #结果33,254|232,70|214,133|90,236
result_list = result.split('|')
print(result_list)

#第三步:进行按照图形识别顺序进行点击 借助selenium执行点击操作
for i in result_list:
    x = result_list.split(',')[0]       #构建x,y轴坐标
    y = result_list.split(',')[1]
    #ActionChains为动作链对象,指定标签元素进行点击(Img_input, int(x), int(y)),click()点击操作,perform()执行动作链
    ActionChains(browser).move_to_element_with_offset(Img_input, int(x), int(y)).click().perform()
time.sleep(2)

#第四步:点击确认标签
OK_button = browser.find_element(By.XPATH, '//*[@class="geetest_commit_tip"]')
OK_button.click()
time.sleep(4)
browser.quit()                                  #关闭所有页面,退出浏览器驱动程序
相关推荐
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴5 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再5 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手7 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934737 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy7 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威9 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ9 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha9 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy9 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法