Введение
Буквально несколько дней назад друг постоянно жаловался, что ему нужно скачивать файлы через разные учетные записи, когда он работает.Он постоянно спрашивал меня, могу ли я помочь написать простой инструмент автоматизации для его реализации.Как раз, когда наступил праздник Праздника лодок-драконов, Я просто изучал Python + Selenium. Вот о чем этот блог.
детали реализации
- Создать проект
Это использованиеPycharm CE
Выполняется инструмент разработки, и для создания проекта выбирается соответствующая версия Python.новыйPackage
и создатьlogin.py
файл, который__init___.py
Это самогенерируемый файл, и его не нужно беспокоить.
- библиотека импорта
ОткрытымFile
ВходитьNew Projects Settings Preferences | Python Interpreter
Нажмите знак +, чтобы загрузить библиотеки, которые вам нужно использовать на этот раз:selenium
,PIL
,pytesseract
,cv2
- Напишите бизнес-код
существуетlogin.py
В файле скачанная выше библиотека импортируется в шапку файла
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from PIL import Image
import pytesseract
import cv2 as cv
при созданииmian
функцию и определить параметры, которые будут использоваться далее, на основеSelenium
Должен быть указан соответствующий драйвер браузера.Нажмите на меня, чтобы загрузить драйвер=
if __name__ == "__main__":
chromedriver_path = "/Users/mac/Source code/py/pythonProject/venv/lib/python3.8/site-packages/selenium/webdriver/chromedriver" #改成你的chromedriver的完整路径地址
# 定义你的账号/密码
username = "改成你的用户名" #用户名
password = "改成你的密码" #密码
Создатьinvestorservice_info
класс и инициализироватьwebdriver
и параметры
class investorservice_info:
def __init__(self):
# 提前定义url 进行以便在login 函数中进行使用
url = 'https://investorservice.cfmmc.com/'
self.url = url
options = webdriver.ChromeOptions()
# options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加载图片,加快访问速度
options.add_experimental_option('excludeSwitches', ['enable-automation']) # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options)
self.browser.set_window_size(1024, 768) # 分辨率 1024*768
self.wait = WebDriverWait(self.browser, 10) #超时时长为10s
Создаватьlogin
Функция, укажите URL-адрес, который нужно открыть, тот, который необходимо просканироватьhtml
Узел передает пользователя, пароль и т. д., которые нам нужно заполнить
# 登录
def login(self):
# 打开网页
self.browser.get(self.url)
# 清空输入框并填入账号密码
self.browser.find_element_by_name('userID').clear()
self.browser.find_element_by_name('userID').send_keys(username)
self.browser.find_element_by_name('password').clear()
self.browser.find_element_by_name('password').send_keys(password)
Тогда указанные вышеelement
Как мы его сканируем? , на самом деле поchrome
Откройте кнопку «Дополнительно» в правом верхнем углу -> дополнительные инструменты -> инструменты разработки.
Найдите узел, например, в приведенном выше коде.userID
известно, чтоname
пройти черезfind_element_by_name
Вы можете найти узел, и вам нужно установить учетную запись и пароль.После установки пароля учетной записи следующим шагом будет код подтверждения. Поскольку код подтверждения является изображением, необходимо использовать технологию распознавания изображений. Вот простое использованиеcv2
а такжеpytesseract
идентифицировать. Сначала определитеrecognize_text
функция для установки различных параметров, таких как оттенки серого распознанного изображения
# 图像识别
def recognize_text(self,image):
# 边缘保留滤波 去噪
blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)
cv.imshow('dst', blur)
# 灰度图像
gray = cv.cvtColor(blur, cv.COLOR_RGB2GRAY)
# 二值化 设置阈值 自适应阈值的话 黄色的4会提取不出来
ret, binary = cv.threshold(gray, 185, 255, cv.THRESH_BINARY_INV)
print(f'二值化设置的阈值:{ret}')
cv.imshow('binary', binary)
# 逻辑运算 让背景为白色 字体为黑 便于识别
cv.bitwise_not(binary, binary)
cv.imshow('bg_image', binary)
# 识别
test_message = Image.fromarray(binary)
test_message.save('new.png')
text = pytesseract.image_to_string(test_message)
print(f'识别结果:{text}')
return text
Сделайте отдельный скриншот текущего узла и сохраните его в корневой каталог проекта.cv
Сделать звонок для чтения скриншотаrecognize_text
функция для разбора.
PS:CV指的是OpenCV
code = self.browser.find_element_by_id("imgVeriCode")
code.screenshot('imgVeriCode.png') # 针对当前节点进行单独截图
src = cv.imread('/Users/mac/Source code/py/pythonProject/imgVeriCode.png')
cv.imshow('input image', src)
vericode = self.recognize_text(src) #获取验证码文字
# 清空输入框并填入验证码
self.browser.find_element_by_name('vericode').clear()
self.browser.find_element_by_name('vericode').send_keys(vericode)
С помощью описанных выше шагов были введены имя пользователя, пароль и проверочный код. Следующим шагом является определение местоположения узла и имитация щелчка для входа в систему.
# 找到点击按钮节点,并点击按钮。
self.browser.find_element_by_class_name('buttonLogin').click()
- Подтвердить и протестировать
Эпилог
- Точность проверочного кода, идентифицированного OpenCv, на этот раз очень низкая.
- Используемый на этот раз Selenium представляет собой автоматизированную среду тестирования, и к API можно обращаться отдельно.
- На этот раз это просто логин и особых технических сложностей нет.Жду в следующий раз полный разбор проверочного кода и загрузку файла.
- Последний веб-сайт, использованный на этот раз, является просто демонстрацией и не имеет никакого значения.