自己做的Goolge和百度翻译的API

我把最终完成的两个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吧。

着手解决问题

403错误的问题

对于上面出现的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

之后无意间搜了一下,发现百度翻译的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的话,铁定是不行的了。

收获

  1. 实际的程序中一定要多用try,因为总会碰到各种各样奇奇怪怪的情况,这样才能一个地方出错之后,程序能够继续运行下去。
  2. 这两天爬虫和搞翻译API的过程算是弄明白了Python里面中文编码的种种问题,高清楚了Unicode和Utf-8和GBK的关系。
  3. 算是初步了解了一下网络编程的入门知识吧,以后有机会了可以再学学。另外看到一个建议就是学的时候不用urllib

你可能感兴趣的:(玩具)