亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2023年04月14日 08:39:15   作者:CrazyDragon_King  
這篇文章主要介紹了Python基于pywinauto實(shí)現(xiàn)的自動(dòng)化采集任務(wù),模擬了輸入單詞, 復(fù)制例句, 獲取例句, 清空剪切板, 然后重復(fù)這個(gè)操作,需要的朋友可以參考下

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

實(shí)現(xiàn)技術(shù)代碼總結(jié) 這是一篇學(xué)習(xí)總結(jié), 前段時(shí)間寫了一個(gè)基于 Python 的自動(dòng)獲取網(wǎng)易有道單詞例句的程序, 效果感覺還不錯(cuò). 但是最終我也沒有使用它, 主要原因有以下三點(diǎn):

  1. 獲取速度太慢, 我想要獲取的單詞比較多.
  2. 網(wǎng)易也會(huì)對(duì)這種行為進(jìn)行封禁的, 采集會(huì)中斷.
  3. 這些例句是有屬于網(wǎng)易的.

實(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++, 我這里就偷懶了, 直接怎么省事怎么來了.

在這里插入圖片描述

單詞輸入框的坐標(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)容就全部獲取到了.

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

控制臺(tái)輸出

在這里插入圖片描述

output.json 文件

在這里插入圖片描述

總結(jié)

這個(gè)雖然沒有什么用處, 不過也了解了不少新的東西. 在這個(gè)過程中學(xué)習(xí)了正則表達(dá)式, 并且也運(yùn)用上了. 如果你關(guān)注我的其它博客的話, 會(huì)發(fā)現(xiàn)我最近一直在更新正則表達(dá)式相關(guān)的文章. 這個(gè)就是一個(gè)小玩具, 不過如果真的要啟動(dòng)的話, 我感覺還蠻麻煩的, 如果感興趣的話, 不妨試一試. 如果有問題的話, 可以在下面評(píng)論. 不過不一定可以及時(shí)回復(fù)了.

到此這篇關(guān)于Python基于pywinauto實(shí)現(xiàn)的自動(dòng)化采集任務(wù)的文章就介紹到這了,更多相關(guān)pywinauto實(shí)現(xiàn)自動(dòng)化采集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python?Pathlib模塊一站式解決文件路徑難題

    使用Python?Pathlib模塊一站式解決文件路徑難題

    在本文中,將詳細(xì)介紹pathlib模塊,包括如何創(chuàng)建路徑、檢查文件和目錄的存在、遍歷目錄、執(zhí)行文件操作等,此外,還將提供豐富的示例代碼來演示如何使用pathlib模塊來處理文件和目錄
    2023-11-11
  • Python調(diào)用Windows命令打印文件

    Python調(diào)用Windows命令打印文件

    Windows命令行打印文件使用print 命令,具體用法可使用help print查看,下面是使用Python調(diào)用print指令執(zhí)行打印文件功能的代碼,需要的朋友可以參考下
    2020-02-02
  • 使用python在本地電腦上快速處理數(shù)據(jù)

    使用python在本地電腦上快速處理數(shù)據(jù)

    這篇文章主要介紹了使用python在本地電腦上快速處理數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 基于Python輕松制作一個(gè)股票K線圖網(wǎng)站

    基于Python輕松制作一個(gè)股票K線圖網(wǎng)站

    在當(dāng)今這個(gè)人手一個(gè)?Web?服務(wù)的年代,GUI?程序還是沒有?Web?服務(wù)來的香啊。所以本文將用Python制作一個(gè)簡(jiǎn)單的股票K線圖網(wǎng)站,感興趣的可以了解一下
    2022-09-09
  • python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法

    python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法

    這篇文章主要介紹了python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法,結(jié)合實(shí)例形式分析了Python針對(duì)微信公眾號(hào)接口操作的相關(guān)技巧,需要的朋友可以參考下
    2017-06-06
  • Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過程

    Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過程

    這篇文章主要介紹了Qt自定義Plot實(shí)現(xiàn)曲線繪制,包含arm觸摸屏多點(diǎn)觸控縮放(只支持兩點(diǎn)),實(shí)時(shí)曲線繪制,數(shù)據(jù)點(diǎn)根據(jù)繪制寬度優(yōu)化,跟蹤點(diǎn)數(shù)據(jù)獲取,雙坐標(biāo)等功能,需要的朋友可以參考下
    2021-11-11
  • 使用 Visual Studio Code(VSCode)搭建簡(jiǎn)單的Python+Django開發(fā)環(huán)境的方法步驟

    使用 Visual Studio Code(VSCode)搭建簡(jiǎn)單的Python+Djan

    這篇文章主要介紹了使用 Visual Studio Code(VSCode)搭建簡(jiǎn)單的Python+Django開發(fā)環(huán)境的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • 對(duì)Xpath 獲取子標(biāo)簽下所有文本的方法詳解

    對(duì)Xpath 獲取子標(biāo)簽下所有文本的方法詳解

    今天小編就為大家分享一篇對(duì)Xpath 獲取子標(biāo)簽下所有文本的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python 內(nèi)置函數(shù)速查表一覽

    Python 內(nèi)置函數(shù)速查表一覽

    這篇文章主要介紹了Python 內(nèi)置函數(shù)速查表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 用python打印菱形的實(shí)操方法和代碼

    用python打印菱形的實(shí)操方法和代碼

    在本篇文章里小編給大家分享了關(guān)于用python打印菱形的實(shí)操方法和代碼,對(duì)此有需要的朋友們可以學(xué)習(xí)下。
    2019-06-06

最新評(píng)論