我把最终完成的两个API程序放到了我的GitHub上https://github.com/haolexiao/Google-Baidu-Translate-API
最终版,百度的API函数,我又加了两个传入的参数,就是百度官方API调用的时候需要的ID和key,这个需要自己去百度官方获取。
缘起于上一篇文章——一个简易而有趣的爬虫——对草榴帖子的爬取.。
爬完草榴准备再爬另外一个知名论坛的的帖子。结果发现那个论坛上的帖子标题大部分都是日文的,虽然能看个似懂非懂,但是终归不如中文看的舒服。于是在想,能否加入一个在线翻译的功能,帖子标题直接翻译完了之后一块写入文件。
因为平时就用Google翻译比较多,所以先查了下Google翻译有没有现成的API,结果发现Google翻译的API居然要钱,于是想着能不能http协议模拟在网页中进行翻译。搜了下果然有相关的资料
小玩意系列:Python调用Google翻译
试了下发现直接运行不行,提示403 Forbidden估计是Google限制了这种方法。
然后在StackOverflow上搜这个问题,发现果然有别人也有这种情况。看到一个答主在好几个问题下面不遗余力的推销自己写的Google Translate的API,是个法国人:
A simple api for google translate
我把它下下来,找到核心代码,试着运行了一下,提示无法建立连接。
另外这个地方再说一点,就是后来我才了解到直接用http模拟网页翻译的方法是违反Google翻译的用户协议的,所以这里Google这个API大家玩玩学学就好,用起来的话还是老老实实的用付费版API吧。
对于上面出现的2个问题,就开始尝试解决。
对于403 Forbidden的问题,搜的解决方案都说是通过构造访问的头部,模拟人正常的上网行为来解决【所以上篇爬虫的文章也可以不用selenium,用构造报头的方法来解决这个问题】
于是我找了下我浏览器的UsrAgent,在控制台下打
navigator.userAgent
就得到了这个浏览器的userAgent,设置好
agent = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'}
接下来在运行之前那个CSDN上那篇文章的方法,结果发现还是不行,能正常运行,但是没有正常的返回结果。探究了一下,没有找到解决方法,个人感觉应该是编码方式的问题。
于是再试Github上的那个程序,之前提示是连接不上,我感觉因为它用的是google主站的Translate,可能被大陆墙掉,所以换成translate.google.cn一试果然可以,看来连上面的参数都是一样的啊。然后又仔细研究了一下它的代码,再自己修改了一番
def unescape(text):
parser = HTMLParser.HTMLParser()
return (parser.unescape(text))
def TranslateByGoogle(text, fromLang="auto", toLang="zh-CN"):
base_link = "http://translate.google.cn/m?hl=%s&sl=%s&q=%s"
text = urllib.quote_plus(text)
link = base_link % (toLang, fromLang, text)
request = urllib2.Request(link, headers=agent)
try:
raw_data = urllib2.urlopen(request).read()
data = raw_data.decode("utf-8")
expr = r'class="t0">(.*?)<'
re_result = re.findall(expr, data)
if (len(re_result) == 0):
result = ""
else:
result = unescape(re_result[0])
return (result)
except Exception, e:
print e
虽然标题上写的是自己做的,但是Google的API这个主要的是参考的是Github上那哥们的实现方法。
但是还有一个问题就出来了,就是毕竟是调用的网页版的曲线方法,不能大规模应用数据,因为迟早要被Google发现。
小总结一下,GitHub上那哥们的方法有两个亮点,一个是用正则表达式去解析那个网页,还有一个亮点是它用的网址是wap版google翻译的网址【即手机网页版】这样的话界面就清晰简单许多,比用电脑版的速度和解析方法都快的非常多。值得一学。
之后无意间搜了一下,发现百度翻译的API也开放着,价格也不贵,49¥/百万字。点进去看了一下,上面说每月前200万字不要钱,统统不要钱。心想:爽。于是赶紧研究了一下它的API和给的Python的demo
写了如下的调用百度API的程序:
def TranslateByBaidu(text,fromLang = 'auto',toLang = 'zh'):
httpClient = None
myurl = '/api/trans/vip/translate'
q = text
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
try:
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
#response是HTTPResponse对象
response = httpClient.getresponse()
result = response.read()
data = json.loads(result)
return data["trans_result"][0]["dst"]
except Exception, e:
print e
finally:
if httpClient:
httpClient.close()
我把上面两个函数统一封装成了一个zztranslater的包,测试一下
>>> print zztranslater.TranslateByBaidu('apple')
苹果
>>> print zztranslater.TranslateByGoogle('apple')
苹果
运行结果一切正常。后来在实际应用的时候,发现百度翻译的自动识别语言功能对于日语不太好用,所以实际上用的时候还是直接指定日语翻译成中文。另外拍了60多页的帖子,百度后台就显示已经用了8w多个字的用量了,看来还挺多,直接用Google的话,铁定是不行的了。