1. 程式人生 > >【Python學習】python爬蟲Google翻譯的實現

【Python學習】python爬蟲Google翻譯的實現

        由於最近的學習,需要把相關的中文語料進行翻譯,自然而然想到爬蟲獲取,主要嘗試了谷歌翻譯和有道翻譯。

一、谷歌翻譯

1.1  所需模組(Python 2.7)

         ①re

         ②urllib

         ③urllib2

         ④execjis

    這些模組一般都可以通過pip來安裝,例如:pip install urllib,但是需要注意的是execjis模組是pip install pyexecjs,否則會提示錯誤。

1.2  一個關鍵的引數

        谷歌翻譯在國內無需任何的VPN什麼的都可以正常使用的,而且翻譯的效果相對比其他的也好得多,但是現在已經不提供免費的介面,其中有一個關鍵的引數tk,處理好它就可以好了,所幸國外已經有人搞定啦,我們只要使用就行啦。對應後面程式碼中的的
Py4Js()類那部分,感興趣的可以研究研究,反正我是看不懂。
1.3  一些細節
    無論是谷歌翻譯或者是有道翻譯我都發現了一個問題,那就是在中譯英的過程中,如果碰到中文的句號或者感嘆號等使段落結束的標點符號,那麼就會切分翻譯,最後以元組返回,我做了一個很蹩腳的處理,就是直接用split()進行符號分割,取回每一句話進行翻譯,最後再串聯起來,如下我做了個句號分割除此之外也可以自己看看返回的結構然後自己寫個正則化取回翻譯的內容,由於本人比較懶,所以你懂得。。。
以下程式碼還有一個問題只能翻譯一定長度的內容超過之後也不能翻譯,如果有大神解決也請指導一下哈!
1.4  中英互換
    由於我需要的是中譯英,所以下面的程式碼是中譯英的,如果需要英譯中,那麼需要對程式碼進行一個小小的修改,只需要把translate函式裡面的url變數中的第二行變為:
"&sl=EN&tl=zh-CN&hl=zh-CNdt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca" \,看不出來區別的仔細看,哈哈哈,當然相應的正則也需要做改變。
1.5  實現程式碼
#-*- coding:utf-8 -*

import re
import execjs
import urllib,urllib2

class Py4Js():
    def __init__(self):
        self.ctx = execjs.compile("""
        function TL(a) {
        var k = "";
        var b = 406644;
        var b1 = 3293161072;

        var jd = ".";
        var $b = "+-a^+6";
        var Zb = "+-3^+b+-f";

        for (var e = [], f = 0, g = 0; g < a.length; g++) {
            var m = a.charCodeAt(g);
            128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
            e[f++] = m >> 18 | 240,
            e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
            e[f++] = m >> 6 & 63 | 128),
            e[f++] = m & 63 | 128)
        }
        a = b;
        for (f = 0; f < e.length; f++) a += e[f],
        a = RL(a, $b);
        a = RL(a, Zb);
        a ^= b1 || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + jd + (a ^ b)
    };

    function RL(a, b) {
        var t = "a";
        var Yb = "+";
        for (var c = 0; c < b.length - 2; c += 3) {
            var d = b.charAt(c + 2),
            d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
            d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
            a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
        }
        return a
    }
    """)

    def getTk(self, text):
        return self.ctx.call("TL", text)



def open_url(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    req = urllib2.Request(url=url, headers=headers)
    response = urllib2.urlopen(req)
    data = response.read().decode('utf-8')
    return data


def translate(content):
    js = Py4Js()
    tk = js.getTk(content)

    content = urllib2.quote(content)
    url = "http://translate.google.cn/translate_a/single?client=t" \
          "&sl=zh-CN&tl=EN&hl=EN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca" \
          "&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1" \
          "&srcrom=0&ssel=0&tsel=0&kc=2&tk=%s&q=%s" % (tk, content)

    result = open_url(url)
    end = result.find("\",")
    if end > 4:
        texts = result[4:end]
    return texts


if __name__ == "__main__":
    text="很多的不滿意。書中竟然都有錯別字以及句子結構的錯誤?故事講得也不好。"
    texts=text.split('。')
    results=''
    for i in range(len(texts)):
        try:
            results = results + "," + translate(str(texts[i]))
        except Exception as e:
            print e
    print results
1.6  輸出結果
很多的不滿意。書中竟然都有錯別字以及句子結構的錯誤?故事講得也不好。
local variable 'texts' referenced before assignment
,A lot of dissatisfied,The book even have typos and sentence structure of the error? The story is not good
參考:
    ①解決tk的github:https://github.com/doloopwhile/PyExecJS
    ②http://blog.csdn.net/yingshukun/article/details/53470424