使用Selenium模拟百度登录

news2025/1/24 7:14:46

前言

    前面我已经安装好了Selenium并模拟成功了一下打开百度页面并进行查询,让我这个python初学者信心倍增,今天再来试一试百度登录

正文

把打开百度的代码放到构造方法中

ps:那个文件目录是用于后面滑块验证图片保存的。

    def __init__(self):
        driver = webdriver.Chrome()
        driver.get('https://www.baidu.com/')
        driver.maximize_window()
        self.page = driver
        self.filename = 'G:\\scroll\\'

点击右上角的“登录”按钮,打开登录框,

代码如下:

        driver = self.page
        driver.find_element(By.ID, 's-top-loginbtn').click()

 效果是这样:

 输入用户名和密码,点击登录

        driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys('用户名')
        driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys('密码')
        driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()

运行之后,竟然出现了一个滑块验证窗口:

 打算用selenium的鼠标事件,模拟拖拽滑块的功能

先获取滑块的id,发现id竟然是动态变化的,后面有个随机变化的数字

没办法,只能使用xpath获取页面元素

/html/body/div[11]/div[1]/div/div[2]/div[2]

 再获取滑块要滑动的框的xpath

/html/body/div[11]/div[1]/div/div[2]/div[1]

并获取这个div元素的宽度,进行移动,代码如下

flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
ActionChains(driver).move_to_element(flybutton).perform()

 flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')

print(flybutton_div.size['width'], flybutton_div.size['height'])

huakuia = ActionChains(driver)
huakuia.click_and_hold(flybutton).perform()

huakuia.move_by_offset(flybutton_div.size['width'], 0).perform()

huakuia.release()

运行了一下,效果是闪了一下,并没有滑动

思考良久,并查资料后看到一篇设置鼠标移动轨迹的文章,遂获得灵感,可能是移动的太快,被百度反爬工具发现了,于是每次5px循环的移动,

flybutton = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[2]')
        ActionChains(driver).move_to_element(flybutton).perform()

        flybutton_div = driver.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[2]/div[1]')

        print(flybutton_div.size['width'], flybutton_div.size['height'])

        huakuia = ActionChains(driver)
        huakuia.click_and_hold(flybutton).perform()
        x = flybutton_div.size['width']
        i = 0
        step = 5
        while i < x:
            i = i + step
            huakuia.move_by_offset(step, 0).perform()
            time.sleep(3)

        huakuia.release()

效果很好,哈哈~,我设置的移动一次休眠3秒,这个可以调快一些,不然心急的可能就认为没有生效。

 滑动滑块是生效了,可是依然没有登录成功,因为系统要求的是把图片放正,并不是把滑块移动最右边

又进行了大量资料的查询,搜到一篇文章,是用python实现图片方向变换的功能,最关键的是里面实现了计算图片倾斜角度的计算,

地址是:python实现图片歪斜纠正+代码和注释

关键代码如下:

继续进行代码改进

保存图片:

    def save_pic(self, file):
        pic_url = self.page.find_element(By.XPATH, '/html/body/div[11]/div[1]/div/div[1]/img').get_attribute('src')
         headers = {
             'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
         }
         res_s = requests.get(pic_url, headers=headers)
         data_s = res_s.content
         保存图片
         with open(file, 'wb') as f:
             f.write(data_s)

获得图片倾斜角度

  def get_angle(self, file):
        # 读取图像
        img = cv2.imread(file)
        # 二值化
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 边缘检测
        edges = cv2.Canny(gray, 50, 150, apertureSize=3)

        # 霍夫变换,摘自https://blog.csdn.net/feilong_csdn/article/details/81586322
        lines = cv2.HoughLines(edges, 1, np.pi / 180, 0)
        for rho, theta in lines[0]:
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a * rho
            y0 = b * rho
            x1 = int(x0 + 1000 * (-b))
            y1 = int(y0 + 1000 * (a))
            x2 = int(x0 - 1000 * (-b))
            y2 = int(y0 - 1000 * (a))
        if x1 == x2 or y1 == y2:
            return 0
        t = float(y2 - y1) / (x2 - x1)
        # 得到角度后
        rotate_angle = math.degrees(math.atan(t))

改进后的滑块验证的代码如下:


        huakuia = ActionChains(driver)
        huakuia.click_and_hold(flybutton).perform()
        x = flybutton_div.size['width']
        i = 0
        step = 5
        while i < x:
            i = i + step
            huakuia.move_by_offset(step, 0).perform()
            time.sleep(3)
            filepath = self.filename + 'scroll' + str(i) + '.png'
            print(filepath)
            self.save_pic(filepath)
            angle = self.get_angle(filepath)
            print('current angle is : %s', angle)
            if math.fabs(angle) < 3:
                break


        print('scroll complete')
        huakuia.release()

运行之后,还是没有成功

最后发现计算的图片倾斜角度都是一样的,打开图片保存目录一看,是下面这样的: 

原来相同一个图片,移动滑块旋转后保存的图片都是一样的,就是初始图片的样子, 怪不得失败了。。。

继续查资料,发现selenium有一个截图的功能,于是使用这个截图功能去保存旋转后的图片

        img = self.page.find_element(by=By.XPATH, value="/html/body/div[11]/div[1]/div/div[1]")
        data_s = img.screenshot(file)  # 截取后直接是二进制,无括号

保存图片后发现还是没有旋转前的图片,真是心累。。。。。

先记录在这里,后面再改进吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实战基础8-列表

一、列表的基本使用 1.列表的格式 定义列的格式&#xff1a;[元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;...&#xff0c;元素n] 变量tmp的类型为列表 tmp [XiaoChen,180,66.0] 列表中的元素可以是不同类型的 2.使用下标获取列表元素 namesList [XiaoChen,Xia…

上海AI lab提出VideoChat:可以与视频对话啦

夕小瑶科技说 原创 作者 | 小戏、ZenMoore 视频相比语言、图像&#xff0c;是更复杂更高级的一类表征世界的模态&#xff0c;而视频理解也同样是相比自然语言处理与计算机视觉的常见工作更复杂的一类工作。在当下大模型的洪流中&#xff0c;自然而然的想法就是大规模语言模型…

子矩形计数(多少个面积为k的全1子矩阵)【思维,两个一维数组相乘得到矩阵,计算一维数组中长度为x的全1子段】

3617. 子矩形计数&#xff08;多少个面积为k的全1子矩阵&#xff09; 输入样例1&#xff1a; 3 3 2 1 0 1 1 1 1输出样例1&#xff1a; 4输入样例2&#xff1a; 3 5 4 1 1 1 1 1 1 1 1输出样例2&#xff1a; 14#include <bits/stdc.h> using namespace std; #define …

Redisson锁的分析

文章目录 一、分布式锁概念1、实现思路2、出现死锁问题如何避免死锁问题 锁过期和释放当前不属于当前线程的锁解决不是加锁线程释放锁锁的过期时间如何解决 二、Redisson分布式锁Redis的部署方式对锁的影响集群模式Redlock实现高可靠的分布式锁 三、代码分析V1代码无锁V2代码单…

【C++从0到王者】第二站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候&#xff0c;我们有时候…

Angular开发之——Angular打包部署项目(04)

一 概述 ng build 构建应用lite-server介绍及安装lite-server部署应用IIS管理器部署应用 二 ng build 构建应用 2.1 执行如下指令构建应用 ng build2.2 构建完成后&#xff0c;会创建一个 dist 文件夹 2.3 直接打开index.html会出错(需要借助于服务器部署) 三 lite-server介…

(二)PUN 2基本教程

一、介绍 PUN 基础教程是一个基于 Unity 的教程。我们将使用 Photon Cloud 开发第一个简单的 PUN 2 多人游戏。目标是同步每个玩家的动画角色、健康值和基本光线投射。 1.概述 本教程将从一个空项目开始&#xff0c;逐步指导您完成整个创建过程。在此过程中&#xff0c;将解释…

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

文章目录 1 形态学概念2 开运算 opening2.1 算子介绍2.2 开运算 开发案例3 闭运算 closing3.1 算子介绍3.2 闭运算 开发案例4 示例原图1 形态学概念 图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。 通过改变局部区域的像素形态,以对目…

数据结构与算法基础知识

线性结构篇 什么是数据结构与算法 回顾我们之前的C语言程序设计阶段&#xff0c;我们已经接触过基本数据类型&#xff0c;并且能够使用结构体对数据进行组织&#xff0c;我们可以很轻松地使用一个结构体来存放一个学生的完整数据&#xff0c;在数据结构学习阶段&#xff0c;我…

Linux篇1

Linux 1. 概述1.1 内容概要1.2 Linux发展1.3 Linux对比Windows 2. 虚拟机下安装CentOS系统2.1 下载安装VMware2.1.1 官网下载VMware软件2.1.2 安装VMware 2.2 下载CentOS镜像2.3 创建虚拟机&#xff08;在虚拟机中安装CentOS&#xff09;2.3.1 创建虚拟硬件环境2.3.2 安装CentO…

从匆匆的一瞥,到两小时泯灭(SQL注入)

从匆匆的一瞥&#xff0c;到两小时泯灭&#xff08;SQL注入&#xff09; 惊鸿一瞥用户名提示jsBase64.js文件手搓轮子&#xff08;python&#xff09;反复搓轮子&#xff08;python-tamper&#xff09; 惊鸿一瞥 昨天晚上分别开了我相识已久的女友&#xff0c;再度回到了单身狗…

暗月内网靶场渗透笔记

简介 靶场下载地址&#xff1a; 靶场地址&#xff1a; https://pan.baidu.com/s/12pSYxSU-ZmurQ9–GFiaXQ 提取码: 3p47虚拟机网络设置&#xff1a; 靶场拓扑图&#xff1a; 靶机账号密码&#xff1a; 信息收集 内网扫描 靶机就在本地&#xff0c;直接进行本地内网扫描即可…

朋友去华为面试,轻松拿到30K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

OpenGL高级-几何着色器

几何着色器的介绍 在顶点和片段着色器之间有一个可选的着色器&#xff0c;叫做几何着色器(Geometry Shader)。几何着色器以一个或多个表示为一个单独基本图形&#xff08;primitive&#xff09;的顶点作为输入&#xff0c;比如可以是一个点或者三角形。几何着色器在将这些顶点发…

C++14中lambda表达式新增加的features的使用

lambda表达式是在C11中引入的&#xff0c;它们可以嵌套在其它函数甚至函数调用语句中&#xff0c;C11中lambda表达式的使用参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/52653313 lambda表达式语法如下&#xff1a;除capture和body是必须的&#xff0c…

索引的作用与结构(数据库)

目录 一、索引概述 1、什么叫索引 2、索引的作用 二、SQL Server索引下的数据组织结构 1&#xff0e;堆集结构 2&#xff0e;聚集索引结构 3&#xff0e;非聚集索引 4&#xff0e;扩展盘区空间的管理 一、索引概述 1、什么叫索引 数据库中的索引与书籍中的索引类似&…

【数据分享】2014-2023年全国各监测站点的逐时、逐日、逐月、逐年AQI数据

空气质量的好坏反映了空气的污染程度&#xff0c;在各项涉及城市环境的研究中&#xff0c;空气质量都是一个十分重要的指标。空气质量是依据空气中污染物浓度的高低来判断的。 我们发现学者王晓磊在自己的主页里面分享了2014年5月以来的全国范围的到站点&#xff08;全国有约2…

小实验:关于期望的乘法性质

小实验&#xff1a;关于期望的乘法性质 引言个人疑惑验证过程样本生成实验过程 附&#xff1a;完整代码 引言 本节通过代码实现期望的乘法性质。 个人疑惑 在数学期望的定义中&#xff0c;有一条随机变量期望的乘法性质&#xff1a; 当随机变量 X , Y \mathcal X,\mathcal Y…

spring如何处理循环依赖

何为循环依赖 所谓的循环依赖&#xff0c;就是两个或者两个以上的bean互相依赖对方&#xff0c;最终形成闭环。比如“A对象依赖B对象&#xff0c;而B对象也依赖A对象”&#xff0c;或者“A对象依赖B对象&#xff0c;B对象依赖C对象&#xff0c;C对象依赖A对象”&#xff1b;类…

MySQL笔记-多表查询

本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…