python使用selenium脚本实现网站自动登录,通过百度文字识别(baidu-aip)或pytesseract自动识别验证码信息

本文主要是介绍python使用selenium脚本实现网站自动登录,通过百度文字识别(baidu-aip)或pytesseract自动识别验证码信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用谷歌浏览器chrome自动登录网页,下载chromedriver.exe并放到项目目录下,选择自己谷歌浏览对应的版本 http://npm.taobao.org/mirrors/chromedriver/

 

1、使用之前必须要先安装第三方扩展库

pip install selenium
pip install Image
pip install baidu-aip
pip install pyinstaller # 安装pyinstaller,打包exe文件需要用到
# pyinstaller -F login.py 把python文件打包成exe文件,加上-w小写可以屏蔽黑窗口

2、封装百度云接口为baidu.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
from aip import AipOcr'''
百度云
'''
APP_ID = '百度云获取'
API_KEY = '百度云获取'
SECRET_KEY = '百度云获取'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)# 参考百度云接口说明
class baiDu:# {'log_id': 4411569300744191453, 'words_result_num': 1, 'words_result': [{'words': ' Y7Y.: 4'}]}def __init__(self, filePath='', options='', url='', idCardSide='front'):# 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,# 最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效self.url = url# 本地图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式self.image = ''# 可选参数self.options = options# front:身份证含照片的一面;back:身份证带国徽的一面self.idCardSide = idCardSideif filePath:# 读取图片with open(filePath, 'rb') as fp:self.image = fp.read()def wordGeneral(self):""" 调用通用文字识别, 50000次/天免费 """return client.basicGeneral(self.image, self.options)  # 还可以使用身份证驾驶证模板,直接得到字典对应所需字段def wordGeneralUrl(self):""" 调用通用文字识别, 图片参数为远程url图片 500次/天免费 """return client.basicGeneralUrl(self.url, self.options)def wordGeneralLocation(self):""" 调用通用文字识别(含位置信息版), 图片参数为本地图片 500次/天免费 """return client.general(self.url, self.options)def wordGeneralUrlLocation(self):""" 调用通用文字识别, 图片参数为远程url图片 500次/天免费 """return client.generalUrl(self.url, self.options)def wordAccurate(self):""" 调用通用文字识别(高精度版) 500次/天免费 """return client.basicAccurate(self.image, self.options)def wordAccurateLocation(self):""" 调用通用文字识别(含位置高精度版) 50次/天免费 """return client.accurate(self.image, self.options)def wordEnhancedGeneral(self):""" 调用通用文字识别(含生僻字版), 图片参数为本地图片 """return client.enhancedGeneral(self.image, self.options)def wordEnhancedGeneralUrl(self):""" 调用通用文字识别(含生僻字版), 图片参数为远程url图片 """return client.enhancedGeneralUrl(self.image, self.options)def wordIdcard(self):""" 调用身份证识别, 图片参数为本地图片 front:身份证含照片的一面;back:身份证带国徽的一面 """return client.idcard(self.image, self.idCardSide, self.options)def wordBankcard(self):""" 调用银行卡识别 """return client.bankcard(self.image)def wordDrivingLicense(self):""" 调用驾驶证识别 """return client.drivingLicense(self.image, self.options)def wordVehicleLicense(self):""" 调用行驶证识别 """return client.vehicleLicense(self.image, self.options)def wordLicensePlate(self):""" 调用车牌识别 """return client.licensePlate(self.image, self.options)def wordBusinessLicense(self):""" 调用营业执照识别 """return client.businessLicense(self.image, self.options)def wordReceipt(self):""" 调用通用票据识别 """return client.idcard(self.image, self.options)def ImageRecognition(self):""" 调用通用物体识别 """return client.advancedGeneral(self.image, self.options)

 

3、新建login.py文件

#!/usr/bin/python
# -*- coding: utf-8 -*-
# pip install selenium
# pip install Image
# pip install baidu-aip
# pip install pyinstaller 安装pyinstaller,打包exe文件需要用到
# pyinstaller -F login.py 把python文件打包成exe文件,加上-w小写可以屏蔽黑窗口import os
import re
import time
import baidu
from selenium import webdriver
from PIL import Image
i = 0
# 获取项目目录
path = os.path.abspath(os.path.dirname(__file__))
loginImage = path + "/login.png"  # 登录页面截图
codeImage = path + "/code.png"  # 定位验证码截图base_url = '登录页URL地址'
browser = webdriver.Chrome()
browser.maximize_window()
browser.implicitly_wait(10)
browser.get(base_url)
# (2)基操
browser.find_element_by_id("username").send_keys("admin")
browser.find_element_by_id("password").send_keys("admin")
# time.sleep(2)# 截图方法
def code_jt():# 登录页面截图browser.save_screenshot(loginImage)  # 可以修改保存地址# 获取图片验证码坐标code_ele = browser.find_element_by_xpath('//img[@style="cursor:pointer;"]')# print("验证码的坐标为:", code_ele.location)# print("验证码的大小为:", code_ele.size)# 图片4个点的坐标位置left = code_ele.location['x']  # x点的坐标top = code_ele.location['y']  # y点的坐标right = code_ele.size['width'] + left  # 上面右边点的坐标down = code_ele.size['height'] + top  # 下面右边点的坐标image = Image.open(loginImage)# 将图片验证码截取code_image = image.crop((left, top, right, down))code_image.save(codeImage)  # 截取的验证码图片保存为新的文件image = Image.open(codeImage)img = image.convert('L')  # P模式转换为L模式(灰度模式默认阈值127)count = 165  # 设定阈值table = []for m in range(256):if m < count:table.append(0)else:table.append(1)img = img.point(table, '1')img.save(codeImage)  # 保存处理后的验证码def bd_img(i=0):# 调用百度云接口api = baidu.baiDu(codeImage)""" 调用通用文字识别, 50000次/天免费 """results = api.wordGeneral()# print(results)for result in results["words_result"]:text = result["words"]text = text.strip()text = re.sub(r'[^A-Za-z0-9]+', '', text)  # 替换特殊字符if len(text) == 6:print("正确" + str(i) + ":"+text)# 添加验证码信息browser.find_element_by_id("code").send_keys(text)# 提交按钮查看按钮元素,click模拟点击提交browser.find_element_by_xpath('//input[@type="submit"]').click()  time.sleep(5)  # 等待5秒,等待网页加载完成# 登录后就可以试下点击签到,打卡功能了# links = browser.find_element_by_xpath('//a[@class="checkin"]') # links.click()else:print("错误" + str(i) + ":" + text)# 提交按钮查看按钮元素,click模拟点击提交browser.find_element_by_xpath('//img[@style="cursor:pointer;"]').click()if i > 10:print('验证码获取失败')exit(1)else:i += 1code_jt()bd_img(i)code_jt()
bd_img(i)

3.1、(备选方案)使用pytesseract识别文字(先安装:pip  install pytesseract)

如果报错:pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it‘s not in your PATH

参考:https://blog.csdn.net/qq_31362767/article/details/107891185 (下载 tesseract.exe并安装,修改pytesseract.py文件的pytesseract_cmd的值)

# 使用pytesseract识别文字
def pytesseract_img(i):# 设置为中文文字的识别 lang='chi_sim'; #设置为英文或阿拉伯字母的识别 lang='eng'text = pytesseract.image_to_string(Image.open(codeImage), lang='eng')text = re.sub(r'[^A-Za-z0-9]+', '', text)  # 替换特殊字符 re.match("^[a-zA-Z0-9]*$", text) andif len(text) == 6:print("正确" + str(i) + ":" + text)browser.find_element_by_id("code").send_keys(text)browser.find_element_by_xpath('//input[@type="submit"]').click()time.sleep(2)  # 等待5秒,等待网页加载完成try:# 如果获取到验证码,可知验证验证错误code = browser.find_element_by_id("code").get_attribute('value')if code:# 刷新验证码browser.find_element_by_xpath('//img[@style="cursor:pointer;"]').click()code_jt()i += 1# 验证码内容置空browser.find_element_by_id("code").clear()browser.find_element_by_id("username").send_keys("admin")browser.find_element_by_id("password").send_keys("admin")pytesseract_img(i)except:print('登录成功')exit(1)# links = browser.find_element_by_xpath('//a[@class="checkin"]')  # 点击签到# links.click()else:print("错误" + str(i) + ":" + text)browser.find_element_by_xpath('//img[@style="cursor:pointer;"]').click()i += 1code_jt()pytesseract_img(i)if i > 20:print('验证码获取失败')exit(1)

4、打包程序

在py程序所在文件夹,打开cmd,输入pyinstaller -F login.py,打包为一个可运行程序,然后使用window的计划任务,就可以实现,定时签到,点赞等登录后的操作。

pyinstaller -D -w -i "D:\wwwroot\python\login\favicon.ico" login.py

如运行后报错:struct.error: unpack requires a buffer of 16 bytes

ico图标在线转换一下就可以了

pyinstaller相关参数

-F:生成一个文件夹,里面是多文件模式,启动快。
-D:仅仅生成一个文件,不暴露其他信息,启动较慢。
-w:窗口模式打包,不显示控制台。
-i:跟图标路径,作为应用icon。

 

5、Pyinstaller打包selenium去除chromedriver黑框问题解决!!!

解决方案就是修改selenium包中的service.py第76行

D:\wwwroot\python\Lib\site-packages\selenium\webdriver\common\service.py

      try:cmd = [self.path]cmd.extend(self.command_line_args())self.process = subprocess.Popen(cmd, env=self.env,close_fds=platform.system() != 'Windows',stdout=self.log_file,stderr=self.log_file,stdin=PIPE)

修改为:

      try:cmd = [self.path]cmd.extend(self.command_line_args())self.process = subprocess.Popen(cmd, env=self.env,close_fds=platform.system() != 'Windows',stdout=self.log_file,stderr=self.log_file,stdin=PIPE, creationflags=134217728)

 

这篇关于python使用selenium脚本实现网站自动登录,通过百度文字识别(baidu-aip)或pytesseract自动识别验证码信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044853

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推