Python爬虫之selenium,有验证码模拟登录

news2024/11/24 20:55:43

一. 前言

        在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过Selenium强大的自动化功能、多浏览器支持、跨平台支持等优点,让我轻松获取一些之前很难获取的数据,这次的案例也是结合之前的所学知识完成

二. 开始前提

        需要下载selenium,以及对应浏览器版本的驱动webdriver,PIL库,selenium,和PIL库都好下载,只需通过python内置的下载,打开python左上角的File里的

setting,进入project:你的项目名下的Python Interpreter

然后再点击那个小" + "号,在搜索需要下载的库就行了,点击Install Package进行下载

tips:pil如果不能下载,可能是pip的版本过低,控制台输入python -m pip install --upgrade pip即可

如果使用默认,是国外下载源下载太慢,点击Manage Repositories 在里边可以输入国内的下载源速度更快,我这里就分享一个国内的https://pypi.tuna.tsinghua.edu.cn/simple/

浏览器我使用的是谷歌的浏览器,尽量去根据浏览器驱动版本去下载对应的版本的浏览器,因为这谷歌的浏览器的自动更新版本实在太头疼,一更新就和驱动版本不对应,导致程序报错,建议就是避免下载最新版本的浏览器,可能会没有相应的驱动

2.1  114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件

三、模拟登陆网站

1.导库

from PIL import Image
from  selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By

2. 打开网站

# 配置选项
options = Options()

#模拟浏览器登录
options.add_experimental_option('detach',True)


# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 初始化浏览器
driver = webdriver.Chrome(options=options)

# 使打开的屏幕最大化
driver.maximize_window()

# 打开网站
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')


四、验证码的处理

1.屏幕截图

        自己使用selenium进行自动化登录的难点还是在于验证码图片的如何获取保存?前期使用request.get()或者是driver.page_source都只能获取到请求之后的验证码图片,下载保存验证码图片早已刷新,跟在页面显示的验证码图片完全不一样,为了解决这个问题,可以使用selenium的屏幕截图的功能,在根据PIL库来对图形进行处理

# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)

# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300  # 右下角坐标

# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)

这里的x,y需要具体根据验证码的页面位置来调节,也可以通过F12网页元素坐标,

在CONSOLE窗口中,输入document.getElementById('元素ID').getBoundingClientRect()

回车,即可查看在屏幕的位置;通过点击调试模式右上角的……。,选择“悬浮模式”,不影响实际的像素数

给出的具体数据也是仅供参考吧,实际截取的具体验证码的位置还得自己慢慢调节

2.保存截图

# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))

# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)

3.获取验证码

        如何获取图片的当中的验证码?根据自己或者人工肉眼来获取有点麻烦,那么就通过第三方验证码识别平台,这里我就推荐超级鹰,比起其他的使用方便快捷很多,关键是新手注册送1000积分,可以供自己测试很多次了,另外1000积分也只要1块,也是相当给力了

那么如何使用这个第三方平台呢?首先注册一个账号,让后下载python的语言Demo,把他解压在项目的文件夹中

将这个chaojiying.py剪切到当前目录就行,然后可以将文件的if __name__=="__main__"下边注释掉,复制到刚才编写的代码中,使用这个py文件,只需从外边导入就行

from chaojiying import Chaojiying_Client
if __name__ == '__main__':
    chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print chaojiying.PostPic(im, 1902)												#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    #print chaojiying.PostPic(base64_str, 1902)  #此处为传入 base64代码

根据使用说明填写自己账号和密码,以及软件id

另外需要把def PostPicf返回为 r.josn值改为,result['pic_str'],就是我截取到图片中的验证码的值

以及软件id在用户中心里面

4.模拟登录

最终我们只需要利用selenium的xpath获取标签的具体位置,然后填写我们获取的数据,就能够自动登录了

driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()

print("登录成功!!!")

以下是完整代码,可以供你们参考

from PIL import Image
from  selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By
from chaojiying import Chaojiying_Client

# 配置选项
options = Options()
options.add_experimental_option('detach',True)

# 设置使用无头浏览器
# options.add_argument("--headless")

# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 初始化浏览器
driver = webdriver.Chrome(options=options)
# 使打开的屏幕最大化
driver.maximize_window()
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')


# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)

# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300  # 右下角坐标

# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)

# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))

# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)

chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
im = open('result_screenshot.png', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
img_code=chaojiying.PostPic(im, 1004)
print ("识别的验证码为"+img_code)


driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()

print("登录成功!!!")

五.总结

        感兴趣的话还可以尝试以下其他的网站进行模拟自动登录,以后可以方便的进行各个软件的登录啦,Selenium真是一个强大的测试工具

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

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

相关文章

Window server 2012搭建FTP

禁止废话,直接上图 !!! 注意:如果点击角色添加保存: Server Manager Error - Server Manager is collecting inventory data. Wizard will be available after data collection finishes 解决方案&#x…

Baidu Comate——让软件研发更高效、更智能

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 一、Baidu Co…

JAVA链表相关习题2

1.反转一个单链表。 . - 力扣(LeetCode) //2在1前面 //1在3前面 //ListNode curhead.next //head.nextnull(翻转后头节点变为最后一个节点) // while(cur ! null) { //记录 当前需要翻转节点的下一个节点 ListNode curNext cu…

9、String类型和基本数据类型转换(Java)

String类型和基本数据类型转换 1、基本数据类型转String类型2、String类型转基本数据类型⭐ 1、基本数据类型转String类型 Java中String类型是字符串类型,是用 “ ” 双引号括起来的内容,所以基本数据类型转String类型直接+“ ”即可。&…

损失一件外套?

2024/05/07,晴 碎碎念一波! 早上洗漱完要出门时,发现自己昨天穿的外套不见了!!!外套上身效果很不错,买了1年多穿的频率非常高,现在丢了还真挺可惜。 衣服口袋有一个耳机&#xff0…

stm32单片机遇到的问题(持续更新)

flymcu下载问题一直显示连接,实际是连接不上 参考,软件一键下载电路等 使用flymcu下载程序过程中,检测两个地方**,第一,两个boot引脚在下载和硬件运行不同的连接方式** BOOT1x,BOOT00:最常用的模…

六西格玛备考攻略:无从下手?一文让你豁然开朗

当你决定备考六西格玛时,可能会感到有些无从下手。毕竟,这是一个涉及多个领域和方面的综合性考试,需要掌握的知识点和技能也非常广泛。但是,只要你有一个清晰的学习计划和一些有效的备考方法,就能够顺利地通过考试。以…

hadoop学习---基于Hive的教育平台数据仓库分析案例(三)

衔接第一部分,第一部分请点击:基于Hive的教育平台数据仓库分析案例(一) 衔接第二部分,第二部分请点击:基于Hive的教育平台数据仓库分析案例(二) 学生出勤模块(全量分析)&#xff1a…

Offer必备算法36_贪心算法三_七道力扣题详解(由易到难)

目录 ①力扣455. 分发饼干 解析代码 ②力扣553. 最优除法 解析代码 ③力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 ④力扣55. 跳跃游戏 解析代码 ⑤力扣134. 加油站 解析代码 ⑥力扣738. 单调递增的数字 解析代码 ⑦力扣991. 坏了的计算器 解析代码…

Adnroid 异常开机半屏重启代码分析

K1/K2包括家教机H9/H10,异常重启的时候都会开机动画都会出现半屏现象: 为了造这个现象,用eclipse把system_process stop掉就可以看到现象了: 由于开机动画是由SurfaceFlinger服务启动,出现异常会调用SurfaceFling…

特斯拉CEO马斯克访华,或加速FSD技术在中国的落地

特斯拉首席执行官埃隆马斯克于4月底进行了中国之旅,这一访问被业内人士认为可能加速特斯拉FSD(Full Self-Drive,完全自动驾驶)技术在中国的应用。业内专家指出,马斯克的此番到访可能会对中国自动驾驶市场产生深远影响&…

视频转GIF动图:一键批量操作技巧,轻松实现动态图像转换

在数字媒体时代,GIF动图因其小巧、循环播放的特性,在网络传播中占据了重要地位。而将视频转换为GIF动图,不仅可以快速捕捉视频中的精彩瞬间,还能为社交媒体、网站和博客等内容创作增添生动与活力。本文将介绍如何通过一键批量操作…

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…

【spark】win10 pyspark3.5.1 安装超级简单

下载地址&#xff1a;https://spark.apache.org/downloads.html 下载完成&#xff1a; 复制文件到自己的路径下&#xff0c;路径最好不要有中文、空格&#xff1b; 解压tgz文件&#xff1a; 修改环境变量&#xff1a; 创建SPARK_HOME&#xff1a; D:\software_download\spar…

实测幻方新出的超强AI大模型,中文能力对比GPT4.0不落下风

目前从网上的消息来看&#xff0c;DeepSeek中文综合能力&#xff08;AlignBench&#xff09;开源模型中最强&#xff0c;与GPT-4-Turbo&#xff0c;文心4.0等闭源模型在评测中处于同一梯队。 话不多说&#xff0c;我们开测&#xff01; 1.首先我们来让他直接来一段逻辑推理【并…

CAN报文总线仲裁机制

对于标准帧而言&#xff0c;有11位的标识符&#xff0c;也就是报文的ID。报文的ID值越小&#xff0c;优先级越高。如果有两个以上的ECU同时发送CAN报文&#xff0c;ID值小的报文可以发送成功。总线仲裁机制是一种非破坏性仲裁&#xff0c;是一种既不会造成已发送数据的延迟&…

rust使用serde_json转换Value为rust中的数据类型

为了方便转换未知json数据&#xff0c;我们可以使用serde提供的value类型来进行转换&#xff0c;将json字符串转化为Value值&#xff0c;然后可以快速使用get方法来获取值&#xff1a; let json_str r#"{"name": "John","age": 30,"c…

3D 交互展示该怎么做?

在博维数孪&#xff08;Bowell&#xff09;平台制作3D交互展示的流程相对简单&#xff0c;主要分为以下几个步骤&#xff1a; 1、准备3D模型&#xff1a;首先&#xff0c;你需要有一个3D模型。如果你有3D建模的经验&#xff0c;可以使用3ds Max或Blender等软件自行创建。如果没…

怎么清理服务器的C盘?

有时候我们经常会遇到C盘被占满的情况&#xff0c;C盘被占满的原因有很多&#xff0c;下面我们就来分析下有可能导致C盘占满的原因&#xff1a; 第一种情况&#xff1a;中毒 打开服务器任务管理器选择进程&#xff0c;并且勾选显示所有用户的进程&#xff0c;我们可以点击映像…

Python进行excel处理-01

最近干采购&#xff0c;每个月要对供应商的对账单&#xff0c;对对应的采购订单号和物料编号的价格和数量&#xff0c;是不是和物料管控总表里面的价格数量是不是一致&#xff0c;于是写了一个代码。 从总表里面找到&#xff0c;对账单里对应采购订单和物料编码的数据&#xf…