python 爬虫调用谷歌翻译和百度翻译(最新)

    工作中会经常用到谷歌翻译和百度翻译,因为两个的翻译结果都需要借鉴,所有经常会有个搜完换另个搜,比较麻烦,然后就做了个小工具。把谷歌翻译和百度翻译整合到一起了。

    谷歌翻译和百度翻译都是分析的请求,然后request请求的,谷歌的网上比较多,比较麻烦的就是参数tk的值,网上也有tk值算法的博客,就不多说了,给大家个链接:http://blog.csdn.net/yingshukun/article/details/53470424。补充一句,由于用pyinstaller打包后execjs模块似乎有问题无法获取句柄,用win32com.client的话结果又不对,具体解决问题没详细调查,偷懒的话就用python写一部分算法,win32com.client运算一部分。

    百度之前的请求参数比较简单,就是翻译前语言,翻译后语言,翻译内容,还有其他两个固定参数。最近忽然发现百度的翻译一直403,查看下参数,原来百度也加了个类似于谷歌tk值的参数,还多了个token,自己分析了下请求,过程不说了,直接泼结果,这是百度javascript的运算代码:

C = "320305.131321201"

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

function Tk(r){
        var o = r.length;
        o > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(o / 2) - 5, 10) + r.substr(-10, 10));
        var t = void 0
          , n = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
        t = null !== C ? C : (C = window[n] || "") || "";
        for (var e = t.split("."), h = Number(e[0]) || 0, i = Number(e[1]) || 0, d = [], f = 0, g = 0; g < r.length; g++) {
            var m = r.charCodeAt(g);
            128 > m ? d[f++] = m : (2048 > m ? d[f++] = m >> 6 | 192 : (55296 === (64512 & m) && g + 1 < r.length && 56320 === (64512 & r.charCodeAt(g + 1)) ? (m = 65536 + ((1023 & m) << 10) + (1023 & r.charCodeAt(++g)),
            d[f++] = m >> 18 | 240,
            d[f++] = m >> 12 & 63 | 128) : d[f++] = m >> 12 | 224,
            d[f++] = m >> 6 & 63 | 128),
            d[f++] = 63 & m | 128)
        }
        for (var S = h, u = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), l = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), s = 0; s < d.length; s++)
            S += d[s],
            S = a(S, u);
        return S = a(S, l),
        S ^= i,
        0 > S && (S = (2147483647 & S) + 2147483648),
        S %= 1e6,
        S.toString() + "." + (S ^ h)
}
console.log(Tk("翻译内容"))

其中C具体的值与页面中源码的gtk值相等:

gtk

代码中:

 n = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);

n = "gtk",window[n] 就是这里的值。


token的值也在页面的源码里可以找到:


python 爬虫调用谷歌翻译和百度翻译(最新)_第1张图片

百度爬取翻译的过程为先获取cookie,然后带cookie再爬取页面获得token值和C值,直接爬的话token值是错的,然后下来就跟谷歌的流程差不多了,具体代码就不写了,网上比较多。

至于请求结果的解析,百度比较简单,就不多说了。谷歌的比较复杂,网上有的几个例子也不是太准确,我是这样解析的,如果有什么好的方法可以交流:

null = None
true = True
false = False
def dealGoogleRst(result):
    result = eval(result)
    translation = []
    Similar = []
    rstdata = result[0]
    for rstitem in rstdata:
        if rstitem and isinstance(rstitem, list):
            if rstitem[0] and rstitem[1]:
                translation.append((rstitem[1],rstitem[0]))

    if result[5] and len(result[5]):
        for simlItem in result[5]:
            simtup = []
            if not isinstance(simlItem, list):
                break
            # 原文为simlItem[0]
            for subitem in simlItem:
                if not subitem or not isinstance(subitem, list) or len(subitem[0])<4:
                    continue
                for miniitem in subitem:
                    simtup.append(miniitem[0])
            Similar.append((simlItem[0],simtup))
    return translation,Similar
第一个返回值是翻译的元祖,第二个返回值时其他翻译的元祖。

(*仅限学习,实际工作中大家最好还是用谷歌和百度提供的API。)


你可能感兴趣的:(python)