欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

代碼

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:
    """
    去除所有空行, 再去除前面四行無關(guān)內(nèi)容
    """
    lines = content.split("\r\n")
    # 因為例句開頭是 數(shù)字. 開頭的, 所以先以這個為特點來進行過濾掉多復(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ù)錯誤")

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


def to_list(line: str) -> List[Dict[str, str]]:
    """
    直接生成列表字典對象
    [{
        "no": 1,
        "original": "",
        "translate"
    }]
    """
    sentences = []
    # 正則表達式
    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 = []
    # 輸出詞匯對象列表
    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)
        # 定位到輸入框(采用坐標定位,定位到大致位置即可)
        mouse.click(coords=(2400, 80))
        # 模擬按鍵操作:全選 刪除 粘貼 回車(觸發(fā)查詢)
        keyboard.send_keys("^a{DELETE}^v{ENTER}")
        # 清空剪切板,這步很重要,防止重復(fù)復(fù)制
        pyperclip.copy("")
        # 鼠標左鍵點擊,這個操作只是為了把鼠標移動到這里
        mouse.click(button="left", coords=(2200, 330))
        # 模擬鍵盤 CTRL+A CTRL+C,直接全選所有的例句(這里會多選一部分內(nèi)容,待會再處理)
        keyboard.send_keys("^a^c")
        # 暫停一會兒,不做操作的太快
        time.sleep(random.random() * 2 + 1)
        # pywinauto 復(fù)制的內(nèi)容是在系統(tǒng)的剪切板里面的,所以需要其它庫讀取
        content = pyperclip.paste()
        # 對內(nèi)容進行簡單的預(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ù)格式錯誤.")
            break
        output_words.append({
            "word": word,
            "example": sentences,
        })
        # 模擬暫停一個較長的隨機時間,沒有必要追求速度,平穩(wěn)運行即可。
        time.sleep(random.random() * 3 + 3)
        # 清空剪切板,這步很重要,防止重復(fù)復(fù)制
        pyperclip.copy("")

    # 抓取完畢一個文件的內(nèi)容后,然后一次性寫入即可。
    # 之前的寫法是一個單詞寫入一次,會造成太多的IO次數(shù),浪費性能!
    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))

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

  1. 修改dir_path, 并且在下面準備一個 input.txt 文件.
  2. 獲取有道詞典進程的 id.
  3. 獲取單詞輸入框的坐標, 獲取復(fù)制粘貼處的坐標.
  4. 將有道詞典界面調(diào)整到例句處.

啟動項目, 需要一個 input.txt 文件, 這里是我測試的文件.

sophisticated
centralization
phenomenon
internationalization
radioactive

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

在這里插入圖片描述

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

在這里插入圖片描述

將有道調(diào)整到這個位置, 首選查詢一個單詞, 選擇例句, 然后保持這個界面不要動即可.

在這里插入圖片描述

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

在這里插入圖片描述

控制臺輸出

在這里插入圖片描述

output.json 文件

在這里插入圖片描述

總結(jié)

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

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

相關(guān)文章

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

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

    在本文中,將詳細介紹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輕松制作一個股票K線圖網(wǎng)站

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

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

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

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

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

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

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

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

    對Xpath 獲取子標簽下所有文本的方法詳解

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

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

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

    用python打印菱形的實操方法和代碼

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

最新評論