使用selenium无头浏览器实现Deepl Translator免费翻译

Deepl Translator 翻译功能目前确实是市面上比较准确的专业翻译工具，但是他的 API 比较贵且在中国大陆地区想花钱也买不到，当前 github 上很多基于 api 的所谓的免费 deepl 翻译代码基本上失效了，用不了几次就会报 “too many requests” 错误。
我试了很多改进方法都失败了，此路不通。
我看了网页浏览器使用的免费翻译基本都是没有限制了，何不使用 selenium 无头浏览器来实现翻译功能呢？
说干就干，开始撸代码：

Copy
#!/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')

几乎完美显示。
几个关键点：
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、我这里只实现了英文到中文的翻译，已经符合我的要求了，其它语言的翻译没有研究，如果有研究成功的欢迎分享出来。