xlhacoo

xlhacoo

拥抱区块链和去中心化。

使用selenium無頭瀏覽器實現Deepl Translator免費翻譯

Deepl Translator 翻譯功能目前確實是市面上比較準確的專業翻譯工具,但是他的 API 比較貴且在中國大陸地區想花錢也買不到,當前 github 上很多基於 api 的所謂的免費 deepl 翻譯代碼基本上失效了,用不了幾次就會報 “too many requests” 錯誤。
我試了很多改進方法都失敗了,此路不通。
我看了網頁瀏覽器使用的免費翻譯基本都是沒有限制了,何不使用 selenium 無頭瀏覽器來實現翻譯功能呢?
說幹就幹,開始撸代碼:

#!/usr/bin/python
# -*- coding:utf-8 -*-
'''需要安裝selenium,使用geckodriver,需要先安裝firefox瀏覽器'''

import re
import hashlib
import urllib
from urllib.parse import unquote
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from selenium.webdriver.support.wait import WebDriverWait
import traceback
import time
import webDeeplTran
from Log import Log

logger = Log(__name__).getlog()

def getDeeplLink(check_url):
    driver = None
    domain = None
    try:
        options = webdriver.FirefoxOptions()
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        options.add_argument('--headless')
        options.add_argument('--window-size=3456,2160')
        driver = webdriver.Firefox(options=options)

        driver.get(check_url)
        # 等待頁面加載完成
        driver.implicitly_wait(60)

        # 查找文本域元素並輸入文字
        input_text_area = driver.find_element(By.XPATH, '/html/body/div[4]/main/div[5]/div[1]/div[2]/section[1]/div[3]/div[2]/d-textarea/div')
        input_text_area.send_keys(' The command Get Computed Label returns the accessibility label (sometimes\nalso referred to as Accessible Name), which is a short string that labels the\nfunction of the control (e.g. the string "Comment" or "Sign In" on a button).\n\nThe command Get Computed Role returns the reserved token value (in ARIA,\nbutton, heading, etc.) that describes the type of control or content in the\nelement.')
        time.sleep(10)
        output_text_area = driver.find_element(By.XPATH, '/html/body/div[4]/main/div[5]/div[1]/div[2]/section[2]/div[3]/div[1]/d-textarea/div')

        output_text = output_text_area.get_attribute('textContent')
        logger.debug(output_text)

        # input_text_area.clear()
        # input_text_area.send_keys(" Selenium recently removed the 16 deprecated find_element(s)_by_x functions in favor of a general find_element and find_elements function that take the 'by' part as their first argument.\nTo update your code, you can use your IDE's find-and-replace-all feature to replace these 16 search terms:")
        # time.sleep(10)
        # output_text = output_text_area.get_attribute('textContent')
        # output_html = output_text_area.get_property('innerHTML')
        # output_text = BeautifulSoup(output_html, 'html.parser').get_text()
        # logger.debug(output_text)
        # 執行 JavaScript 代碼,設置 div 元素的 lang 屬性
        # driver.execute_script("document.getElementById('target-dummydiv').setAttribute('lang', 'zh-CN');")

        # 截圖並保存到 D:\\ 目錄下
        # driver.save_screenshot('D:\\deepl.png')

        # 關閉瀏覽器
        driver.quit()
    except Exception as e:
        logger.debug(traceback.format_exc())
    finally:
        if driver:
            driver.quit()

if __name__ == "__main__":
    getDeeplLink('https://www.deepl.com/translator')

運行上面代碼,首先使用截圖功能看看無頭瀏覽器是否正常顯示:
driver.save_screenshot('D:\deepl.png')

deepl.png

幾乎完美顯示。
幾個關鍵點:
1、這是獲取輸入框,輸入英文需要翻譯的文本。
input_text_area = driver.find_element(By.XPATH, '/html/body/div[4]/main/div[5]/div[1]/div[2]/section[1]/div[3]/div[2]/d-textarea/div')

使用 input_text_area.send_keys 方法輸入。

2、獲取中文翻譯框對象
output_text_area = driver.find_element(By.XPATH, '/html/body/div[4]/main/div[5]/div[1]/div[2]/section[2]/div[3]/div[1]/d-textarea/div')
獲取翻譯後的文本。
output_text = output_text_area.get_attribute('textContent')

3、在輸入英文文本後需要等待 N 秒,以便加載翻譯後的文本,然後才能獲取,所以我這裡使用了 time.sleep (10)

4、多次循環輸入翻譯文本需要清除以前的文本,使用下面的方法:
input_text_area.clear()

5、我這裡使用的是 firefox 瀏覽器及 geckodriver.exe 驅動,都安裝最新版就 OK 了,試了 chrome 沒有成功,不知道是不是我安裝的問題,有研究 chrome 成功的可以分享經驗。

6、我這裡只實現了英文到中文的翻譯,已經符合我的要求了,其它語言的翻譯沒有研究,如果有研究成功的歡迎分享出來。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。