溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

發(fā)布時(shí)間:2023-04-15 16:28:32 來源:億速云 閱讀:142 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

基于 pywinauto 的自動(dòng)化采集任務(wù)

實(shí)現(xiàn)技術(shù)

這個(gè)程序使用了一個(gè) Python 的自動(dòng)化庫(kù) ---- pywinauto, 因?yàn)楣俜揭呀?jīng)很久沒更新了, 所以 python 的版本最高只能是 Python 3.7 左右, 我用的是 Python 3.7.1. 我使用它模擬了輸入單詞, 復(fù)制例句, 獲取例句, 清空剪切板, 然后重復(fù)這個(gè)操作, 總體上實(shí)現(xiàn)比較簡(jiǎn)陋. 而且, 為了簡(jiǎn)單, 我是之間手動(dòng)切換到例句頁(yè), 這樣就不用使用程序來切換到例句頁(yè)了.

代碼

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")
# 順序錯(cuò)誤的單詞
error_words = []
# 有道詞典的進(jìn)程id
processId = 13840


def line_process(content: str) -> str:
    """
    去除所有空行, 再去除前面四行無關(guān)內(nèi)容
    """
    lines = content.split("\r\n")
    # 因?yàn)槔溟_頭是 數(shù)字. 開頭的, 所以先以這個(gè)為特點(diǎn)來進(jìn)行過濾掉多復(fù)制的開頭
    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("抓取數(shù)據(jù)錯(cuò)誤")

    content = "\n".join(filter_lines) + "\n"  # 補(bǔ)上一個(gè) \n, 不然正則會(huì)漏掉一個(gè)結(jié)果
    return content


def to_list(line: str) -> List[Dict[str, str]]:
    """
    直接生成列表字典對(duì)象
    [{
        "no": 1,
        "original": "",
        "translate"
    }]
    """
    sentences = []
    # 正則表達(dá)式
    REGEXP = r'(?P<no>\d+?)\.\n(?P<original>.+?)\n(?P<translate>.+?)\n'
    # 編譯
    pattern = re.compile(REGEXP)
    # 匹配
    rs = pattern.finditer(line)
    # 組裝結(jié)果
    for r in rs:
        print(r.groupdict())
        sentences.append(r.groupdict())
    return sentences


if __name__ == "__main__":
    # 連接網(wǎng)易有道詞典
    app = Application(backend="uia").connect(process=processId)
    # 獲取需要的窗口
    win = app.window(class_name="RICHEDIT50W")

    # 輸入詞匯列表
    input_words = []
    # 輸出詞匯對(duì)象列表
    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)
        # 清空剪切板,這步很重要,防止重復(fù)復(fù)制
        pyperclip.copy("")
        # 將輸入數(shù)據(jù)復(fù)制到剪切板
        pyperclip.copy(word)
        # 定位到輸入框(采用坐標(biāo)定位,定位到大致位置即可)
        mouse.click(coords=(2400, 80))
        # 模擬按鍵操作:全選 刪除 粘貼 回車(觸發(fā)查詢)
        keyboard.send_keys("^a{DELETE}^v{ENTER}")
        # 清空剪切板,這步很重要,防止重復(fù)復(fù)制
        pyperclip.copy("")
        # 鼠標(biāo)左鍵點(diǎn)擊,這個(gè)操作只是為了把鼠標(biāo)移動(dòng)到這里
        mouse.click(button="left", coords=(2200, 330))
        # 模擬鍵盤 CTRL+A CTRL+C,直接全選所有的例句(這里會(huì)多選一部分內(nèi)容,待會(huì)再處理)
        keyboard.send_keys("^a^c")
        # 暫停一會(huì)兒,不做操作的太快
        time.sleep(random.random() * 2 + 1)
        # pywinauto 復(fù)制的內(nèi)容是在系統(tǒng)的剪切板里面的,所以需要其它庫(kù)讀取
        content = pyperclip.paste()
        # 對(duì)內(nèi)容進(jìn)行簡(jiǎn)單的預(yù)處理后,加入output_words
        try:
            lines = line_process(content)
        except BaseException as exp:
            print(exp)
            # 如果抓取出現(xiàn)問題,說明被網(wǎng)易抓了現(xiàn)行,直接退出即可。
            break

        sentences = to_list(lines)
        if not sentences:
            print("獲取例句為空, 可能是數(shù)據(jù)格式錯(cuò)誤.")
            break
        output_words.append({
            "word": word,
            "example": sentences,
        })
        # 模擬暫停一個(gè)較長(zhǎng)的隨機(jī)時(shí)間,沒有必要追求速度,平穩(wěn)運(yùn)行即可。
        time.sleep(random.random() * 3 + 3)
        # 清空剪切板,這步很重要,防止重復(fù)復(fù)制
        pyperclip.copy("")

    # 抓取完畢一個(gè)文件的內(nèi)容后,然后一次性寫入即可。
    # 之前的寫法是一個(gè)單詞寫入一次,會(huì)造成太多的IO次數(shù),浪費(fèi)性能!
    with open(output_path, "a+", encoding="utf-8") as output_file:
        output_file.write(json.dumps(
            output_words, ensure_ascii=False, indent=4))

        # 錯(cuò)誤單詞記錄
        with open(error_path, "w", encoding="utf-8") as err_file:
            err_file.writelines("\n".join(error_words))

演示 如果想要啟動(dòng)這個(gè)代碼, 還是蠻復(fù)雜的. 我這里直接把需要的步驟羅列一下, 希望能幫助感興趣的同學(xué).

  1. 修改dir_path, 并且在下面準(zhǔn)備一個(gè) input.txt 文件.

  2. 獲取有道詞典進(jìn)程的 id.

  3. 獲取單詞輸入框的坐標(biāo), 獲取復(fù)制粘貼處的坐標(biāo).

  4. 將有道詞典界面調(diào)整到例句處.

啟動(dòng)項(xiàng)目, 需要一個(gè) input.txt 文件, 這里是我測(cè)試的文件.

sophisticated
centralization
phenomenon
internationalization
radioactive

我是通過任務(wù)管理器獲取的進(jìn)程 pid, 你也可以通過其它訪問. 或者最簡(jiǎn)單的是使用 Inspect 和 Spy++, 我這里就偷懶了, 直接怎么省事怎么來了.

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

單詞輸入框的坐標(biāo), 復(fù)制粘貼處的坐標(biāo). 第一個(gè)坐標(biāo)是為了定位輸入框的, 然后程序會(huì)把單詞復(fù)制進(jìn)去, 并執(zhí)行一下回車鍵, 然后內(nèi)容被查詢出來. 再將鼠標(biāo)移動(dòng)到第二個(gè)坐標(biāo)處, 這里只是移動(dòng)到下面的空白處就行了, 然后會(huì)執(zhí)行一個(gè)全選 CTRL+A 操作. 這樣一個(gè)單詞的內(nèi)容就全部獲取到了.

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

將有道調(diào)整到這個(gè)位置, 首選查詢一個(gè)單詞, 選擇例句, 然后保持這個(gè)界面不要?jiǎng)蛹纯?

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

最后就是程序的執(zhí)行了, 錄制的 GIF 做了加速處理, 實(shí)際上執(zhí)行的時(shí)候, 是特意加了延時(shí)的, 防止被過早的發(fā)現(xiàn)了.

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

控制臺(tái)輸出

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

output.json 文件

Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)

讀到這里,這篇“Python基于pywinauto怎么實(shí)現(xiàn)自動(dòng)化采集任務(wù)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI