来自CSDN博主-顽强拼搏的阿k的stealth.min.js。
之前我发布的浅析Python谷歌翻译库的核心里面的代码仍然可以获取翻译结果,但是对于复杂翻译语种,获取到的结果和网页上的显示不同,这让我很气。
我自己也尝试进行再次破解过,但是万事俱备,只欠x-goog-batchexecute-bgr。这个参数是我的心头病,只要掌握了这个参数的获取方式,就能直接从谷歌翻译官网获取到正确的返回结果。如果有人会获取这个参数,可以留言评论,鄙人感激不尽!
要想实现对复杂语种的准确翻译爬取,只能使用selenium爬虫了,用“所见即所得”的方式,无疑是最简单的爬虫方式,不过谷歌翻译官网默认不会允许webdriver的存在,所以就要使用stealth.min.js文件进行抹除webdirver的特征指纹,使用方式参照源码。
谷歌翻译的自动语种识别有时候不准,拼音会识别为中文,所以这里我借用了一下百度翻译识别语种的接口,如有需要可以自行更改。
# _*_ coding:utf-8 _*_
# FileName: google.py
# IDE: PyCharm
# 菜菜代码,永无BUG!
import time
import requests
from fastapi import FastAPI # pip install uvicorn fastapi jinja2 aiofiles
from urllib.parse import quote
from selenium import webdriver, common
from starlette.middleware.cors import CORSMiddleware
# from selenium.webdriver.chrome.options import Options
# options = Options()
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
lans = ['af', 'sq', 'am', 'ar', 'hy', 'az', 'eu', 'be', 'bn', 'bs', 'bg', 'ca', 'ceb', 'ny', 'zh-cn', 'zh-tw', 'co', 'hr', 'cs', 'da', 'nl', 'en', 'eo', 'et', 'tl', 'fi', 'fr', 'fy', 'gl', 'ka', 'de', 'el', 'gu', 'ht', 'ha', 'haw', 'iw', 'he', 'hi', 'hmn', 'hu', 'is', 'ig', 'id', 'ga', 'it', 'ja', 'jw', 'kn', 'kk', 'km', 'ko', 'ku', 'ky', 'lo', 'la', 'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi', 'mr', 'mn', 'my', 'ne', 'no', 'or', 'ps', 'fa', 'pl', 'pt', 'pa', 'ro', 'ru', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si', 'sk', 'sl', 'so', 'es', 'su', 'sw', 'sv', 'tg', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'ug', 'uz', 'vi', 'cy', 'xh', 'yi', 'yo', 'zu']
@app.get('/stop')
def stop():
driver.close()
driver.quit()
print('Stopped complete .')
return 'Stopped complete .'
@app.get('/translate/{des:str}/{text:str}')
# 比赛开始结束
def competitions(des, text):
lan = requests.post('https://fanyi.baidu.com/langdetect', data={"query": text}).json()["lan"]
for la in lans:
if la in lan.lower():
lan = la
break
else:
lan = 'auto'
for la in lans:
if la in des.lower():
des = la
break
else:
des = 'zh-CN'
url = f'https://translate.google.cn/?sl={lan}&tl={des}&text={quote(text)}&op=translate'
try:
driver.get(url)
# driver.find_element_by_class_name('er8xn').send_keys(text)
except common.exceptions.TimeoutException:
pass
while 1:
try:
return {'lan': lan, 'des': des, 'res': driver.find_element_by_class_name('VIiyi').text}
except common.exceptions.NoSuchElementException:
time.sleep(0.5)
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36')
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('excludeSwitches', ['enable-automation']) # webdriver防检测
# options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 禁止图片加载
driver = webdriver.Chrome(options=options)
# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { # 关闭 window.navigator.webdriver 属性
# "source": """
# Object.defineProperty(navigator,'webdriver',{
# get: () => false
# })
# """
# })
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": open('stealth.min.js', 'r', encoding='utf-8').read()})
driver.get('https://translate.google.cn/')
driver.set_page_load_timeout(1)
print('Started complete .')