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

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

WBOY
リリース: 2023-04-26 23:13:17
転載
1620 人が閲覧しました

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート