python 谷歌翻译_python爬虫实践之谷歌翻译
目录
概述
爬取谷歌翻译,根据提供的文字进行翻译。
准备
所需模块
urllib.request
execjs:执行JS代码的模块
涉及知识点
python基础
urllib模块基础
运行效果
控制台打印:
完成爬虫
1. 分析网页
打开谷歌翻译,按F12查看网页
把URL复制到代码中,
import urllib.request
url="https://translate.google.cn/translate_a/single?client=webapp&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&source=bh&ssel=0&tsel=0&kc=1&tk=459678.110220" \
"&q=hello"
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
}
# 获取request对象
req = urllib.request.Request(url, headers=header)
# 响应的数据是通过Ajax返回的JSON格式数据,注意编码问题
resp = urllib.request.urlopen(req).read().decode("utf-8")
# 打印
print(resp)
运行程序:
现在换个单词试试,比如说word
再次去谷歌翻译,查看URL
比较下两者的URL:
# 失败URL:url="https://translate.google.cn/translate_a/single?client=webapp&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&source=bh&ssel=0&tsel=0&kc=1&tk=459678.110220&q=word"
# 成功URL:url="https://translate.google.cn/translate_a/single?client=webapp&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&otf=1&ssel=0&tsel=0&kc=1&tk=892279.733285&q=word"
比较了发现其中的tk值是在变化的,不是同一个tk参数值。
注意了参数tk是根据JavaScript代码计算出来的,不同的翻译内容,计算的值不一样。
在网上查找了下,发现有大神已经把提取该tk值的算法分享出来了,其GitHub地址为:
因此计算tk值的python代码为:
import execjs
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)
这代码是参考别人的,里面由于需要运行JavaScript代码所以需要导入execjs模块,这个模块能够调用JavaScript代码。
里面封装了一个getTK方法,传入的参数就是带翻译的字符串。
2. 爬虫代码
import urllib.request
import execjs
# 谷歌翻译
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):
"""获取tk值"""
return self.ctx.call("TL", text)
# 获取要翻译的文字
key = input("请输入要翻译的英文文字(英译中):")
# 获取Py4Js实例
py = Py4Js()
print(py.getTk(key)) # 打印tk值
# 请求的URL
url = "https://translate.google.cn/translate_a/single?client=webapp&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&otf=1&ssel=0&tsel=0&kc=7&tk=" + py.getTk(
key) + "&q=" + key
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
}
# 获取request对象
req = urllib.request.Request(url, headers=header)
# 响应的数据是通过Ajax返回的JSON格式数据,注意编码问题
resp = urllib.request.urlopen(req).read().decode("utf-8")
# 打印
print(resp)
该爬虫代码是英译中,而不能中译英,否则会出问题的。
运行代码,会得到上面的运行效果的图:
3. 中译英
和上面的代码类似,不同的是对URL的处理而已。
代码如下:
import urllib.parse
import urllib.request
import execjs
# 谷歌翻译
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):
"""获取tk值"""
return self.ctx.call("TL", text)
# 获取要翻译的文字
key = input("请输入要翻译的中文文字(中译英):")
# 获取Py4Js实例
py = Py4Js()
print(py.getTk(key)) # 打印tk值
# 对中文进行处理
data = urllib.parse.urlencode({"q": key})
# 请求的URL
url = "https://translate.google.cn/translate_a/single?client=webapp&sl=zh-CN&tl=en&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ssel=6&tsel=3&kc=1&tk=" + py.getTk(
key) + "&" + data
print(url)# 打印URL
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
}
# 获取request对象
req = urllib.request.Request(url, headers=header)
# 响应的数据是通过Ajax返回的JSON格式数据,注意编码问题
resp = urllib.request.urlopen(req).read().decode("utf-8")
# 打印
print(resp)
控制台打印:
python 谷歌翻译_python爬虫实践之谷歌翻译相关推荐
- 爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子
前言 文章起源于自己的一个需求:想要删除掉自己的若干个小号在豆瓣小组上的发帖及回复记录.这是一件看似简单的事情,但是一遍一遍的重复操作实在让我感到非常绝望,特别是删除自己的回复时,有时候回复的帖子的回 ...
- python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...
- python爬虫实践报告_Python 爬虫实践:浅谈数据分析岗位
原标题:Python 爬虫实践:浅谈数据分析岗位 转自:法纳斯特 讲道理,pyspider确实是一款优秀的爬虫框架,我们可以利用它快速方便地实现一个页面的抓取. 不过带来便捷性的同时,也有它的局限性, ...
- python爬取凤凰新闻_Python爬虫实践(10)--爬取凤凰网汽车资讯详情
本期为python爬虫实践的第十节,传送门: python 通过上一期教程的代码,我们已经可以抓取到凤凰网汽车频道的资讯列表.本期教程,我们接着上一期的代码,去进一步获取资讯的详细内容. 资讯列表信息 ...
- 花一千多学python值吗_Python爬虫应该怎么学?程序猿花了一周整理的学习技巧,请收下...
原标题:Python爬虫应该怎么学?程序猿花了一周整理的学习技巧,请收下 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多, ...
- python爬虫英文翻译_Python爬虫实现翻译功能
前言 学了这么久的python理论知识,需要开始实战来练手巩固了. 准备 首先安装爬虫urllib库 pip install urllib 获取有道翻译的链接url 需要发送的参数在form data ...
- python re爬虫_Python爬虫实践 —— Regular Expressions Python re模块
Python re 模块,提供了 Perl 风格的正则表达式模式.re 模块使 Python 语言拥有全部的正则表达式功能. (1)re.match 函数 match函数 从字符串起始位置匹配一个模式 ...
- python爬取公众号阅读量_Python爬虫实践:如何快速、高效的爬取微信公众号阅读在看数...
自从2013年,自媒体开始崛起.再到2014年,自媒体开始能够赚钱,自媒体逐渐成为这个时代的一个趋势性的潮流. 随着公众号平台的不断火爆,各个自媒体平台如春笋班拔地而起.自媒体的蓬勃发展,很大程度上重 ...
- python爬虫爬商品库存_python爬虫实践——爬取京东商品信息
1 ''' 2 爬取京东商品信息:3 请求url:4 https://www.jd.com/5 提取商品信息:6 1.商品详情页7 2.商品名称8 3.商品价格9 4.评价人数10 5.商品商家11 ...
最新文章
- 车道检测--VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition
- 结婚率连7年下降,数据揭秘单身背后复杂逻辑
- GitGitHub语法大全
- 你的数据可也可以发三篇NAR的文章
- chrome调试本地项目, 引用本地javascript文件
- 若依如何实现翻页保留选择?
- 【MTK 驱动开发---camera 基础知识1】
- Hamming(汉明)窗的原理介绍及实例解析
- 常用电子元器件基本知识整理
- linux进程阻塞例子,linux阻塞与非阻塞驱动例子
- 记录linux历史命令,Linux历史记录命令
- 无锡python培训班,无锡Python+人工智能培训
- win10左右声道音量不一致的解决方法
- java发送qq邮箱验证_java代码发送邮箱验证码与qq邮箱smtp服务
- 不使用redis,在前后端分离项目的条件下将验证码进行储存
- 案例分享 | 某券商利用AI技术进行告警关联分析(上)
- Java识别获取pdf中文字信息(此方法任意pdf的信息都可以拿到)
- python中arcsec_主页
- 获取tomcat服务器上的部分日志
- 五线城市房价已大幅下跌,房地产泡沫破裂或由此开始
热门文章
- RTX 4090和RX 7900XT哪个好 RTX 4090和RX 7900XT差距
- 机器人暮色枪骑皮肤_那些年我们用过的机器人的Q技能,枪骑高调,它还是玩家们的最爱...
- 创建用户桌面进程(突破Session 0隔离)
- 【20140202】曼昆著《经济学原理》读书笔记
- spark day06 + day07 + day08
- android设置wifi区域码,Android P - WiFi 国家码设置流程
- 身为产品经理,你真的明白头脑风暴怎么运用吗?
- HT1621驱动代码详细解析
- JQuery制作小风车特效
- MySQL 基础篇 -- 视图