工作中会经常用到谷歌翻译和百度翻译,因为两个的翻译结果都需要借鉴,所有经常会有个搜完换另个搜,比较麻烦,然后就做了个小工具。把谷歌翻译和百度翻译整合到一起了。
谷歌翻译和百度翻译都是分析的请求,然后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("翻译内容"))
代码中:
n = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
n = "gtk",window[n] 就是这里的值。
token的值也在页面的源码里可以找到:
百度爬取翻译的过程为先获取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。)