Python实现获取网页内容及自动填表单与登录功能
作者:极客柒 发布时间:2023-10-23 23:55:27
标签:Python,网页,自动,登录
食用前准备
python 3.10.10 #二维码的库ddddocr 需要
库
import time
import ddddocr
源码
# import threading # 导入threading模块
# from Feishu_SendMsg import *
# Identification verification code
import time
import ddddocr
interval = 100 * 60
# def delayCall(): # 定义方法
# SendMsg("选题 快快快!!!")
# timer=threading.Timer(interval,delayCall) # 每秒运行
# timer.start() # 执行方法
# if __name__ == '__main__': #
# t1=threading.Timer(interval,function=delayCall) # 创建定时器
# t1.start() # 开始执行线程
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
# SendMsg("自动填表单")
options = webdriver.ChromeOptions()
options.add_argument('--enable-automation')
options.add_argument('--no-sandbox')
options.add_argument('--disable-extensions')
options.add_argument('--start-maximized')
options.add_argument('--disable-infobars')
prefs = {"profile.default_content_setting_values.autocomplete_enabled": 2}
options.add_experimental_option("prefs", prefs)
# SendMsg("创建 Chrome 浏览器实例")
# 创建 Chrome 浏览器实例
browser = webdriver.Chrome(options=options)
# SendMsg("打开网页")
browser.get('www.tttttttt.com')
# SendMsg("找到账号和密码框元素并输入指定字符串")
username = browser.find_element("name","username")
password = browser.find_element("name","userpass")
usercode = browser.find_element("name","usercode")
img_verifycode = browser.find_element("id","img_verifycode")
# SendMsg("自动填充账号密码")
username.send_keys("11111")
password.send_keys("11111")
verifycodeBase64 = img_verifycode.screenshot_as_base64
ocr = ddddocr.DdddOcr()
res = ocr.classification(verifycodeBase64)
usercode.send_keys(res)
# SendMsg(f"识别并填写验证码: {res}")
# SendMsg("提交表单")
password.send_keys(Keys.RETURN)
# SendMsg("登陆: 提交表单")
知识点补充
下面为大家介绍一下文中用到的ddddocr库的相关使用吧
识别验证码的python 库有很多,用起来也并不简单,ddddocr (带带弟弟ocr)库是一个简单实用的识别验证码的库,推荐给大家
ddddocr具体使用方法
import os
import ddddocr
from time import sleep
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
class GetVerificationCode:
def __init__(self):
self.res = None
url = '要登录的地址'
self.driver = webdriver.Chrome()
self.driver.maximize_window() # 将浏览器最大化
self.driver.get(url)
# 获取验证码信息
def getVerification(self):
# 获取当前文件的位置、并获取保存截屏的位置
current_location = os.path.dirname(__file__)
screenshot_path = os.path.join(current_location, "..", "VerificationCode")
# 截取当前网页并放到自定义目录下,并命名为printscreen,该截图中有我们需要的验证码
sleep(1)
self.driver.save_screenshot(screenshot_path + '//' + 'printscreen.png')
sleep(1)
# 定位验证码
imgelement = self.driver.find_element(By.XPATH, '验证码图片的Xpath定位')
# 获取验证码x,y轴坐标
location = imgelement.location
# 获取验证码的长宽
size = imgelement.size
# 写成我们需要截取的位置坐标
rangle = (int(location['x'] + 430),
int(location['y'] + 200),
int(location['x'] + size['width'] + 530),
int(location['y'] + size['height'] + 250))
# 打开截图
i = Image.open(screenshot_path + '//' + 'printscreen.png')
# 使用Image的crop函数,从截图中再次截取我们需要的区域
fimg = i.crop(rangle)
fimg = fimg.convert('RGB')
# 保存我们截下来的验证码图片,并读取验证码内容
fimg.save(screenshot_path + '//' + 'code.png')
ocr = ddddocr.DdddOcr()
with open(screenshot_path + '//' + 'code.png', 'rb') as f:
img_bytes = f.read()
self.res = ocr.classification(img_bytes)
print('识别出的验证码为:' + self.res)
# 判断验证码错误时的提示信息是否存在
def isElementPresent(self, by, value):
try:
element = self.driver.find_element(by=by, value=value)
except NoSuchElementException:
pass
# 发生了NoSuchElementException异常,说明页面中未找到该元素,返回False
return False
else:
# 没有发生异常,表示在页面中找到了该元素,返回True
return True
# 登录
def login(self):
self.getVerification()
self.driver.find_element(By.XPATH, '用户名输入框Xpath定位').send_keys('用户名')
self.driver.find_element(By.XPATH, '密码输入框Xpath定位').send_keys('密码')
self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
sleep(1)
self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
sleep(2)
isFlag = True
while isFlag:
try:
isPresent = self.isElementPresent(By.XPATH, '验证码错误时的提示信息Xpath定位')
if isPresent is True:
codeText = self.driver.find_element(By.XPATH, '验证码错误时的提示信息Xpath定位').text
if codeText == "验证码不正确":
self.getVerification()
sleep(2)
self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').clear()
sleep(1)
self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
sleep(1)
self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
sleep(2)
tips = self.driver.find_element(By.XPATH,
'未输入验证码时的提示信息Xpath定位').text
if tips == "请输入验证码":
self.getVerification()
sleep(2)
self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').click()
sleep(1)
self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
sleep(1)
self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
sleep(2)
continue
else:
print("验证码正确,登录成功!")
except NoSuchElementException:
pass
else:
isFlag = False
sleep(5)
self.driver.quit()
if __name__ == '__main__':
GetVerificationCode().login()
识别结果
来源:https://blog.csdn.net/qq_39162566/article/details/129707575
0
投稿
猜你喜欢
- 问题:windows环境下新建或编辑文本文件,保存时会在头部加上BOM。使用ftp上传到linux下,在执行时第一行即报错。以下方法可以去除
- '==' 比较的是两个对象的值'is' 比较的是两个对象的内存地址(id)下面我们着重理解 'is&
- Python内置模块logging管理不同级别log打印和存储,非常方便,从此告别了使用print打桩记录,我们来看下logging的魅力吧
- 本文实例为大家分享了Python 12306抢火车票的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-fro
- __import__() 函数用于动态加载类和函数 。如果一个模块经常变化就可以使用 __import__() 来动态载入。语法__impo
- 打开文件操作文件1打开文件时,需要指定文件路径和打开方式打开方式:r:只读w:只写a:追加“+”表示可以同时读写某个文件r+:读写w+:写读
- 其实网上有很多关于python2.6.6 升级到python2.7的文章,但是我对比这些类似的文章升级之后,发现其中有错误的地方,于是决定还
- 1、使用MySQLdb读取出来的数据是unicode字符串,如果要写入redis的hash中会变成"{u'eth0_out
- 网站标准(或称“WEB标准”)对于每一个开发网站和做网页的人来说,都是不可忽视的,这不仅是一个潮流,而是一个标准,一个更加符合规范的做法,而
- 首先,假设我们有如下餐厅数据集:import pandas as pddf = pd.DataFrame({ 'rest
- 一、python下载安装下载安装python最新版本https://www.python.org/downloads/windows/这里勾
- 前面已经提到,CSS之所以如此强大,是因为它采用HTML文档结构来决定其样式的应用。但这仅仅只是一方面,因为它只暗示了CSS之所以使用文档结
- 先了解如何利用python语言实现以平面和标记物进行姿态估计本实验只是先实现一个简单的小例子。简单来说就是先识别出图像中的参考面,再拍摄一张
- 一、List移除某个值remove以Python 3.x版本为主remove:列表值移除方法1、函数编号函数名说明1remove移除列表中匹
- 很多朋友说JavaScript的decodeURI函数也可以实现,但有bug所有呢,下面看下下面的函数,经过测试使用暂时没什么问题,我在之前
- 其中 offset and fetch 最重要的新特性是 用来 分页,既然要分析 分页,就肯定要和之前的分页方式来比较了,特别是 Row_N
- 匿名管道管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么
- 每个写asp程序人必会的知识!在ASP编程中使用数组数组的定义Dim MyArrayMyArray = Array(1,5,123,12,9
- 很多朋友在留言区询问关于python上传文件和字符到服务器的问题,现编针对这个给大家整理了一个解决办法。上传简单的字符串def send_s
- 对于刚刚学习编程的同学来说对编程是非常陌生的,对很多的代码也是非常陌生,高中忙于学习的我们甚至可以说是对编程是一无所知,进入大学进入到这个专