主要内容:模拟bilibili账号密码登录,不要实现的的实现功能是单击登录按钮,切换登录方式, 输入账号和密码,然后完成图片点击验证,最后单击立即登录按钮。
1、第一步:通过selenium模块访问bilibili的登录页面,定位并单击账号登陆按钮,然后分别定位账号和密码输入框,并输入账号和密码。
2、第二步:识别图片中图形的位置。
3、第三步:进行按照图形识别顺序进行点击。
4、第四步:点击确认标签。
##############################
##作者:白雪公主的后妈
##时间: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() #关闭所有页面,退出浏览器驱动程序