ホームページ  >  記事  >  バックエンド開発  >  Python と pywinauto を使用して自動収集タスクを実装する手順と方法

Python と pywinauto を使用して自動収集タスクを実装する手順と方法

WBOY
WBOY転載
2023-04-26 23:13:171572ブラウズ

pywinauto に基づいた収集タスクの自動化

実装テクノロジ

このプログラムでは、Python 自動化ライブラリである pywinauto を使用します。これは、正式バージョンが長い間更新されていないためです。 Python のバージョン 最高は Python 3.7 程度までしかありません。私は Python 3.7.1 を使用します。単語の入力、例文のコピー、例文の取得、クリップボードのクリア、およびこの操作の繰り返しをシミュレートするために使用しました。全体的に、実装は次のとおりです。また、Simpleの場合は手動で例文ページに切り替えるので、プログラムで例文ページに切り替える必要はありません。 ##requirements.txt

pyperclip==1.8.2
pywin32==304
pywinauto==0.6.8

コード

import os
import random
import time
import re
from typing import Dict, List
from pywinauto.application import Application
from pywinauto import mouse
from pywinauto import keyboard
import pyperclip
import json


# 程序处理中的各种路径
dir_path = r"C:/Users/Dick/Desktop/work/DragonEnglish/tools"
input_path = os.path.join(dir_path, r"input.txt")
output_path = os.path.join(dir_path, r"output.json")
error_path = os.path.join(dir_path, r"error.txt")
# 顺序错误的单词
error_words = []
# 有道词典的进程id
processId = 13840


def line_process(content: str) -> str:
    """
    去除所有空行, 再去除前面四行无关内容
    """
    lines = content.split("\r\n")
    # 因为例句开头是 数字. 开头的, 所以先以这个为特点来进行过滤掉多复制的开头
    count = 0
    for i in range(len(lines)):
        if re.match(r"\d+\.", lines[i]):
            count = i
            break

    lines = lines[count:]
    filter_lines = []
    for line in lines:
        if line.strip() != "":  # 过滤空行
            if not line.startswith("youdao") and not \
                    (line.startswith("《") and line.endswith("》")):  # 过滤来源
                filter_lines.append(line)

    if len(filter_lines) % 3 != 0:
        raise Exception("抓取数据错误")

    content = "\n".join(filter_lines) + "\n"  # 补上一个 \n, 不然正则会漏掉一个结果
    return content


def to_list(line: str) -> List[Dict[str, str]]:
    """
    直接生成列表字典对象
    [{
        "no": 1,
        "original": "",
        "translate"
    }]
    """
    sentences = []
    # 正则表达式
    REGEXP = r&#39;(?P<no>\d+?)\.\n(?P<original>.+?)\n(?P<translate>.+?)\n&#39;
    # 编译
    pattern = re.compile(REGEXP)
    # 匹配
    rs = pattern.finditer(line)
    # 组装结果
    for r in rs:
        print(r.groupdict())
        sentences.append(r.groupdict())
    return sentences


if __name__ == "__main__":
    # 连接网易有道词典
    app = Application(backend="uia").connect(process=processId)
    # 获取需要的窗口
    win = app.window(class_name="RICHEDIT50W")

    # 输入词汇列表
    input_words = []
    # 输出词汇对象列表
    output_words = []
    # 打开输入文件,初始化输入词汇列表
    with open(input_path, "r", encoding="utf-8") as input_file:
        input_words = input_file.read().split("\n")

    for word in input_words:
        print("正在抓取单词: %s" % word)
        # 清空剪切板,这步很重要,防止重复复制
        pyperclip.copy("")
        # 将输入数据复制到剪切板
        pyperclip.copy(word)
        # 定位到输入框(采用坐标定位,定位到大致位置即可)
        mouse.click(coords=(2400, 80))
        # 模拟按键操作:全选 删除 粘贴 回车(触发查询)
        keyboard.send_keys("^a{DELETE}^v{ENTER}")
        # 清空剪切板,这步很重要,防止重复复制
        pyperclip.copy("")
        # 鼠标左键点击,这个操作只是为了把鼠标移动到这里
        mouse.click(button="left", coords=(2200, 330))
        # 模拟键盘 CTRL+A CTRL+C,直接全选所有的例句(这里会多选一部分内容,待会再处理)
        keyboard.send_keys("^a^c")
        # 暂停一会儿,不做操作的太快
        time.sleep(random.random() * 2 + 1)
        # pywinauto 复制的内容是在系统的剪切板里面的,所以需要其它库读取
        content = pyperclip.paste()
        # 对内容进行简单的预处理后,加入output_words
        try:
            lines = line_process(content)
        except BaseException as exp:
            print(exp)
            # 如果抓取出现问题,说明被网易抓了现行,直接退出即可。
            break

        sentences = to_list(lines)
        if not sentences:
            print("获取例句为空, 可能是数据格式错误.")
            break
        output_words.append({
            "word": word,
            "example": sentences,
        })
        # 模拟暂停一个较长的随机时间,没有必要追求速度,平稳运行即可。
        time.sleep(random.random() * 3 + 3)
        # 清空剪切板,这步很重要,防止重复复制
        pyperclip.copy("")

    # 抓取完毕一个文件的内容后,然后一次性写入即可。
    # 之前的写法是一个单词写入一次,会造成太多的IO次数,浪费性能!
    with open(output_path, "a+", encoding="utf-8") as output_file:
        output_file.write(json.dumps(
            output_words, ensure_ascii=False, indent=4))

        # 错误单词记录
        with open(error_path, "w", encoding="utf-8") as err_file:
            err_file.writelines("\n".join(error_words))

デモ このコードを開始したい場合、それは非常に複雑です。ここでは、必要な手順を列挙します。お役に立てれば幸いです。興味のある学生。

dir_path を変更し、以下の input.txt ファイルを準備してください。

  1. Youdao Dictionary プロセスの ID を取得します。

  2. 単語入力ボックスの座標を取得し、コピーして貼り付ける場所の座標を取得します。

  3. #Youdao 辞書インターフェイスを例文に合わせて調整します。

  4. プロジェクトを開始するには、

    input.txt

    ファイルが必要です。これが私がテストしたファイルです。
##洗練された

集中化 現象 国際化

放射性物質


タスク マネージャーを通じてプロセス PID を取得しました。また、次の方法でもアクセスできます。他の方法。または、最も簡単な方法は、Inspect と Spy を使用することです。私はここで怠け者です。問題を直接回避する方法。


単語入力ボックスの座標、コピーと貼り付けの場所。最初の座標は入力ボックスの位置を指定し、次にプログラムが単語をコピーして Enter キーを押すと、内容が照会されます。次に、マウスを 2 番目の座標に移動します。ここでは単に移動します。それを下の空白スペースに移動し、CTRL A で全選択操作を行うと、単語の内容がすべて取得されます。

Python と pywinauto を使用して自動収集タスクを実装する手順と方法

Youdao をこの位置に調整します、最初に単語をクエリし、例文を選択し、このインターフェイスを変更しないでください。

Python と pywinauto を使用して自動収集タスクを実装する手順と方法

最後のステップはプログラムの実行です。記録された GIF は高速化されました。実際、実行時には、早期に発見されないように意図的に遅延が追加されます。

Python と pywinauto を使用して自動収集タスクを実装する手順と方法output.json ファイル

Python と pywinauto を使用して自動収集タスクを実装する手順と方法

以上がPython と pywinauto を使用して自動収集タスクを実装する手順と方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。