Python 爬虫之Google翻译实现
来源:互联网 发布:淘宝网怎么经营 编辑:程序博客网 时间:2024/06/05 09:43
用过一些翻译工具,发现还是Google翻译最准确,但是Google翻译现在没有免费的API,网上的一些爬虫资料也太过陈旧了,Google翻译的机制早都改了,完全无用。这里简单的提供一下实现,需要更多功能可以去增加。
谷歌翻译在国内是可以是可以使用的,我这里没有使用任何vpn或者代理,访问无问题。
1、抓个包分析一下
发现是get请求方式,那就更简单了,直接拼接URL,分析一下参数,发现最关键的是q,q后面带的就是待翻译的文本,我这里只需要将英文翻译成汉语,其他的参数就直接照抄了,如果有其他需求,直接修改相关参数即可
http://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&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&otf=1&srcrom=0&ssel=0&tsel=0&kc=5&tk=196711.345729&q=替换为待翻译字符串
2、在浏览器中使用拼接好的URL,发现请求失败,在网页中多次测试,发现Google果然做了一些工作。其中有个关键的参数tk,该参数是利用js代码计算出来的,不同的翻译内容,计算出的值就不同,没办法,只能去研究一下js的代码了,但是博主不太会js,而且该tk值的算法也是相当复杂的,最后只能借助万能的Google搜索,果然不出所料,已经有牛人提取了该tk值的算法代码。github地址:https://github.com/cocoa520/Google_TK
好了,进入正题了,附上Python代码
import execjsclass 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)
在Python 中调用js代码的方式有不少种,比如PyV8库,但是目前不支持Python3,还可以使用微软的ScriptControl,只需要安装Python的win32库,但是API有些繁琐,这里我使用API最简洁的PyExecJS库,下载安装完成后,导入execjs模块即可。(给个github地址:https://github.com/doloopwhile/PyExecJS)
这里封装一个获取tk值的方法,传入的参数就是待翻译的字符串
接下来就是具体实现的Python3代码:
import urllib.request from HandleJs import Py4Js def open_url(url): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} req = urllib.request.Request(url = url,headers=headers) response = urllib.request.urlopen(req) data = response.read().decode('utf-8') return data def translate(content,tk): if len(content) > 4891: print("翻译的长度超过限制!!!") return content = urllib.parse.quote(content) url = "http://translate.google.cn/translate_a/single?client=t"\ "&sl=en&tl=zh-CN&hl=zh-CN&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) #返回值是一个多层嵌套列表的字符串形式,解析起来还相当费劲,写了几个正则,发现也很不理想, #后来感觉,使用正则简直就是把简单的事情复杂化,这里直接切片就Ok了 result = open_url(url) end = result.find("\",") if end > 4: print(result[4:end]) def main(): js = Py4Js() while 1: content = input("输入待翻译内容:") if content == 'q!': break tk = js.getTk(content) translate(content,tk) if __name__ == "__main__": main()
需要注意,使用get请求,URL携带的数据有限,这里经过测试,翻译的文本长度大概4891个字符左右
到这里,基本功能就已经实现了,如果有其他的需求,可以做一些完善,比如直接将文本读取,翻译结果返回后再保存为文本文件,方便阅读,特别是做一些英文文档的翻译
- Python 爬虫之Google翻译实现
- 【Python学习】python爬虫Google翻译的实现
- Python爬虫基础之百度翻译的实现
- 利用python爬虫实现简单翻译软件
- Python基础爬虫之百度翻译
- 【Python学习】python爬虫有道翻译的实现
- python 网络爬虫 翻译
- python爬虫百度翻译
- Python爬虫之从简单的翻译程序说起
- google 翻译python版本
- python google翻译
- Python实现爬取google翻译API结果
- python爬虫04--有道翻译
- Asp实现google翻译
- python之基于有道翻译实现翻译功能
- 3. 用爬虫实现翻译
- python网络爬虫入门(二)——用python简单实现调用谷歌翻译
- python汉译英-调用Google翻译
- 【UESTC】1423 - Run Step(打表 & 组合)
- Get和POST区别小结
- springmvc运行过程详解
- JSON的各种解析小结
- POJ 1395 Cog-Wheels 已被翻译
- Python 爬虫之Google翻译实现
- Leetcode 之 Major Element II --摩尔投票法
- C#中添加窗口的步骤
- 跳跃表的原理及实现
- 自定义公用池之:Constraint 约束
- 一段生成大数据测试数据的java code 片段
- poj2356Find a multiple
- 输出乘法口诀
- js 类似微信索引列表移动