Python

Введение

Работу по вводу данных можно разделить на следующие категории:

  1. Извлечение данных из таблиц (Excel, Google Sheets) и перемещение их в другое место (веб-страница или другая таблица).
  2. Просмотр данных в интернете (онлайн магазины) или в журналах, сбор данных и файлов (простого текста и изображений) и копирование их в базу данных.

Каким образом можно ускорить этот процесс? В этом нам помогут модули автоматизации Python!

Предварительная подготовка

Документацию и руководство пользователя по модулю PyAutoGUI в Python можно прочитать ЗДЕСЬ. Загрузка модуля выполняется через командную строку:

pip install pyautogui

Чтобы использовать модуль внутри сценария, его нужно импортировать:

import pyautogui as pag

«as pag» используется для ввода меньшего количества символов в следующем коде: pag.click() намного короче, чем pyautogui.click().

Управление клавиатурой

Примечание: инструкции в данном разделе основаны на документации PyAutoGUI и содержат несколько примеров из нее.

typewrite() — самая главная команда для управления клавиатурой. Например:

pag.typewrite("Hello world!")

Этот фрагмент кода работает, как при написании «Hello world!» вручную, однако выполняется без нажатия клавиш. Очень удобно!

Чтобы добавить задержку между нажатиями клавиш, можно использовать следующую команду:

pag.typewrite('Hello world!', interval=0.25)

Она печатает каждый символ с интервалом в четверть секунды.

Примечание: с помощью этой функции можно печатать только сообщения. Внутри функции typewrite() невозможно нажать enter или использовать shift.

Список клавиш клавиатуры

Ниже приведен список клавиш клавиатуры, которые можно передать функциям press(), keyUp(), keyDown() или hotkey():

['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']

Функции keyDown() и keyUp() имитируют нажатие и отпускание клавиши. Например:

pag.keyDown("enter")
pag.keyUp("enter")

Этот фрагмент кода нажимает и отпускает клавишу enter. Будьте осторожны и никогда не оставляйте клавишу нажатой 🙂

Функция press() объединяет две предыдущих. Клавиша, передаваемая функции, нажата и отпущена:

pag.press("enter")

Два предыдущих фрагмента кода выдают одинаковый результат!

Чтобы нажать несколько клавиш, аргументы передаются в виде списка:

pag.press(['enter', 'tab', 'enter'])

Последняя функция клавиатуры — это hotkey(), упрощающая использование сочетаний клавиш. Просто передайте ей несколько клавиш, которые будут нажаты по порядку, а затем отпущены в обратном порядке. Например:

pag.hotkey('ctrl', 'alt', 'delete')

Эквивалентно следующему коду:

pag.keyDown('ctrl')
pag.keyDown('alt')
pag.keyDown('delete')
pag.keyUp('delete')
pag.keyUp('alt')
pag.keyUp('ctrl')

Управление мышью

Места расположения мыши на экране обозначены координатами X и Y: X начинается с 0 с левой стороны и увеличивается вправо, а Y начинается с 0 в верхней части экрана и увеличивается с понижением.

0,0       X increases -->
+---------------------------+
|                           | Y increases
|                           |     |
|   1920 x 1080 screen      |     |
|                           |     V
|                           |
|                           |
+---------------------------+ 1919, 1079

Чтобы узнать размер экрана, используйте функцию size:

pag.size()

Она возвращает кортеж, например (1920×1080), обозначающий разрешение экрана.

Список других функций мыши:

pag.moveTo(600, 600)   # перемещение мыши на X 600, Y 600
pag.moveTo(100, 200, 2)   # перемещение мыши на X 100, Y 200 в течение 2 секунд

pag.move(0, 50)       # перемещение мыши на 50 пикселей относительно ее предыдущего расположения

pag.dragTo(100, 200, button='left')     # перемещение мыши на X 100, Y 200 с удержанием левой кнопки

pag.dragTo(300, 400, 2, button='left')  # перемещение мыши на X 300, Y 400 в течение 2 секунд с удержанием левой кнопки

pag.click()    #  щелчок мыши
pag.click(x=100, y=200)  # перемещение на 100, 200, а затем нажатие левой кнопкой

pag.click(button='right')  # щелчок правой кнопкой мыши
pag.doubleClick()  # двойной щелчок левой кнопкой
pag.click(clicks=2)  # двойной щелчок левой кнопкой мыши
pag.click(clicks=2, interval=0.25)  # двойной щелчок левой кнопкой мыши с паузой в четверть секунды между щелчками

pag.scroll(10)   # прокрутка на 10 "кликов" вверх
pag.scroll(-10)   # прокрутка на 10 "кликов" вниз

pag.hscroll(10)   # прокрутка на 10 "кликов" вправо
pag.hscroll(-10)   # прокрутка на 10 "кликов" влево

Более подробную информацию можно найти ЗДЕСЬ или ЗДЕСЬ.

Применение на практике

Предположим, что вы руководите большой компанией и хотите, чтобы весь 1 000 000 сотрудников были зарегистрированы на популярном веб-сайте. Первый способ — выполнить это вручную. Если для регистрации одного пользователя требуется 30 секунд, а работа будет выполняться 24 часа в сутки, то этот процесс займет более 347 дней. Достаточно долго. Вместо этого можно потратить несколько часов на написание программы и предоставить выполнение работы компьютерам. Приступим!

Допустим, вы уже определили список адресов электронной почты всех сотрудников:

emails = ["[email protected]", "[email protected]y.address", "[email protected]", "[email protected]", "[email protected]", "[email protected]", ...]

Приступим к созданию кода. Он начинается с импортов и открытия платформы crazycoolwebsite.

import pyautogui as pag
import webbrowser

webbrowser.open_new("crazycoolwebsite.com")

Затем нужно добавить код для навигации по процессу регистрации. Предположим, что он выглядит следующим образом:

  1. Главная страница -> нажатие «Get started»
  2. Всплывающее окно -> нажатие «Sign up with email»
  3. Окно ввода электронной почты -> ввод адреса электронной почты и нажатие Enter
  4. Готово! Закройте окно, а пользователь получит дальнейшие инструкции на электронную почту.

В коде это выглядит так:

import pyautogui as pag
import webbrowser

emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", ...]

for email in emails:
    webbrowser.open_new("crazycoolwebsite.com")
    pag.click(x=xcoord1, y=ycoord1)    #Get started 
    pag.click(x=xcoord2, y=ycoord2)    #Sign up with email
    pag.typewrite(email)               #Type your email
    pag.press("enter")
    pag.hotkey('ctrl', 'w')            #closes current tab

Вот и все! Если указаны точные координаты нажатия (xcoord1, ycoord1, xcoord2 и ycoord2), то код сделает свое дело. Не советуем использовать этот метод как способ рассылки спама.

Примечание: при автоматизации следует учитывать временной фактор. Вы не можете предсказать, сколько времени займет открытие файла или загрузка веб-страницы. Найдите безопасные интервалы для «приостановки кода» или реализации функций, которые определяют, загружена ли страница (PyAutoGUI проверяет, является ли определенное количество пикселей белым (страница все еще загружается) или обозначено другим цветом (страница загружена!).

Немного о работе по вводу данных в целом: большинство заданий не так просты, как в описанном выше примере, однако процесс извлечения данных из A и вставки их в B остается практически неизменным. Различаются только структуры данных и ресурсы.

Добавим немного воображения

Этот модуль можно использовать и во многих других случаях. Например, в некоторых компьютерных играх крайне важна точность. Сможете ли вы перетащить мышь или нажать клавишу пробела более точно, чем написанный сценарий?

Игра Scary maze

Цель игры Scary maze состоит в том, чтобы перемещать курсор по синему пути. При соприкосновении с черным пикселем вы возвращаетесь к началу.

Игра Scary maze

Заключительная часть с узким коридором, конечно, самая сложная. А что, если создать сценарий python для завершения лабиринта?

Игра Google Dino

Другой пример: помните этого парня?

Игра Google Dinosaur

Он, вероятно,самый нелюбимый друг всех пользователей Chrome, поскольку он приходит в гости лишь при отсутствии интернета. Попробовать игру можно ЗДЕСЬ. Цель состоит в обходе препятствий, приближающихся к Dino.

Сделайте несколько скриншотов игрового экрана и проанализируйте следующее:

  • С какой скоростью движется препятствие?
  • На какой высоте оно находится?
  • Событие происходит днем или ночью? Примечание: пиксели чередуются между черным и белым цветами.
  • Сколько препятствий отображается в данный момент?
  • Где должно находиться препятствие для запуска команды прыжка/уклонения?

На этом изображении препятствия обозначены красными прямоугольниками. Dino должен прыгнуть, когда красная коробка коснется зеленой линии.

Отсрочка отправки текста

Сталкивались ли вы с такой ситуацией, когда, закончив писать письмо/сообщение в 3 часа ночи, вы не знаете, отправлять ли его сейчас или подождать до утра, чтобы избежать таких вопросов, как «почему вы не спите ночью, как нормальные люди?» Есть простое решение:

import pyautogui as pag
import time

time.sleep(21600)     # эквивалентно шести часам
pag.press("enter")

Этот сценарий откладывает отправку сообщения на 6 часов (время задержки можно изменить).

Читайте также:


Перевод статьи Markus Rene PaeAutomating your job with Python