日常Google翻译接口编写
Posted 囚生CY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常Google翻译接口编写相关的知识,希望对你有一定的参考价值。
最近有批量翻译的需求,看了一下有python接口的翻译效果都不行,最终还是自己写了一个调用google翻译的类。因为现在google翻译反爬虫的手段很强势,普通requests很难突破,这里给出基于selenium的代码(Firefox)
from requests import Session
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
"""
作者:囚生CY
平台:CSDN
时间:2019/05/31
转载请注明原作者
创作不易,仅供分享
"""
# https://translate.google.cn/translate_a/single?client=webapp&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=2&ssel=3&tsel=0&kc=12&tk=543918.972561&q=I want to be a man
# Google现在反爬虫做得确实很好, 上面这个是提交URL, 里面有个tk字段我看不懂什么意思, 而且这个tk字段是很关键的字段, 缺少后无法获取
# 所以只能考虑先用selenium弄了
class Translation():
def __init__(self,):
self.langs = ["cn","en"] # 目前处理中英文
self.options = webdriver.FirefoxOptions() # 火狐驱动配置
self.options.add_argument("--headless") # 设定无头浏览器的配置
pass
def translate(self,string,target="cn",headless=False):
if not target in self.langs:
print("ERROR: 未知的语言")
return False
b = webdriver.Firefox(options=self.options) if headless else webdriver.Firefox() # 使用无头浏览器省时间
b.get("https://translate.google.cn/")
if target=="cn": pass # 默认翻译为中文
if target=="en": b.find_elements_by_id("sugg-item-en")[1].click()# 英文就点一下(这个定位有点麻烦, 因为有个跟它长得很像的元素, 之后再想想办法吧)
time.sleep(.5)
b.find_element_by_id("source").send_keys(string)
print("开始等待...")
t = time.time()
# 一般的短句子这个等待很短,只有不到1秒,大部分时间浪费在前后的代码上
WebDriverWait(b,30).until(lambda b_: b_.find_element_by_xpath("//span[@title='']").is_displayed())
html = b.page_source
soup = BeautifulSoup(html,"lxml")
span = soup.find("span",class_="")
print(span.string)
b.quit()
if __name__ == "__main__":
t = Translation()
#t.translate("I am a Chinese",target="cn")
t.translate("我是一个中国人",target="en")
这里使用了无头浏览器(设定参数headless为True),运行时不会弹出浏览器,如果出问题可以改掉webdriver的options参数看看运行哪里有问题。
因为翻译成英文对应的那个按钮与左边那个英文的元素极其相似,用xpath定位需要加很多条件,就太硬了。我代码里直接用id定位取第二个元素,可能过一段时间出问题(比如左边没有英文这个按钮了)?
测试基本上问题不大,速度有点堪忧,主要浪费在打开浏览器上,普通的一句话1秒内都能翻译出来;
附一张上面代码的运行结果?
分享学习,共同进步!
以上是关于日常Google翻译接口编写的主要内容,如果未能解决你的问题,请参考以下文章