目录

概述

爬取谷歌翻译,根据提供的文字进行翻译。

准备

所需模块

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爬虫实践之谷歌翻译相关推荐

  1. 爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子

    前言 文章起源于自己的一个需求:想要删除掉自己的若干个小号在豆瓣小组上的发帖及回复记录.这是一件看似简单的事情,但是一遍一遍的重复操作实在让我感到非常绝望,特别是删除自己的回复时,有时候回复的帖子的回 ...

  2. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  3. python爬虫实践报告_Python 爬虫实践:浅谈数据分析岗位

    原标题:Python 爬虫实践:浅谈数据分析岗位 转自:法纳斯特 讲道理,pyspider确实是一款优秀的爬虫框架,我们可以利用它快速方便地实现一个页面的抓取. 不过带来便捷性的同时,也有它的局限性, ...

  4. python爬取凤凰新闻_Python爬虫实践(10)--爬取凤凰网汽车资讯详情

    本期为python爬虫实践的第十节,传送门: python 通过上一期教程的代码,我们已经可以抓取到凤凰网汽车频道的资讯列表.本期教程,我们接着上一期的代码,去进一步获取资讯的详细内容. 资讯列表信息 ...

  5. 花一千多学python值吗_Python爬虫应该怎么学?程序猿花了一周整理的学习技巧,请收下...

    原标题:Python爬虫应该怎么学?程序猿花了一周整理的学习技巧,请收下 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多, ...

  6. python爬虫英文翻译_Python爬虫实现翻译功能

    前言 学了这么久的python理论知识,需要开始实战来练手巩固了. 准备 首先安装爬虫urllib库 pip install urllib 获取有道翻译的链接url 需要发送的参数在form data ...

  7. python re爬虫_Python爬虫实践 —— Regular Expressions Python re模块

    Python re 模块,提供了 Perl 风格的正则表达式模式.re 模块使 Python 语言拥有全部的正则表达式功能. (1)re.match 函数 match函数 从字符串起始位置匹配一个模式 ...

  8. python爬取公众号阅读量_Python爬虫实践:如何快速、高效的爬取微信公众号阅读在看数...

    自从2013年,自媒体开始崛起.再到2014年,自媒体开始能够赚钱,自媒体逐渐成为这个时代的一个趋势性的潮流. 随着公众号平台的不断火爆,各个自媒体平台如春笋班拔地而起.自媒体的蓬勃发展,很大程度上重 ...

  9. python爬虫爬商品库存_python爬虫实践——爬取京东商品信息

    1 ''' 2 爬取京东商品信息:3 请求url:4 https://www.jd.com/5 提取商品信息:6 1.商品详情页7 2.商品名称8 3.商品价格9 4.评价人数10 5.商品商家11 ...

最新文章

  1. 车道检测--VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition
  2. 结婚率连7年下降,数据揭秘单身背后复杂逻辑
  3. GitGitHub语法大全
  4. 你的数据可也可以发三篇NAR的文章
  5. chrome调试本地项目, 引用本地javascript文件
  6. 若依如何实现翻页保留选择?
  7. 【MTK 驱动开发---camera 基础知识1】
  8. Hamming(汉明)窗的原理介绍及实例解析
  9. 常用电子元器件基本知识整理
  10. linux进程阻塞例子,linux阻塞与非阻塞驱动例子
  11. 记录linux历史命令,Linux历史记录命令
  12. 无锡python培训班,无锡Python+人工智能培训
  13. win10左右声道音量不一致的解决方法
  14. java发送qq邮箱验证_java代码发送邮箱验证码与qq邮箱smtp服务
  15. 不使用redis,在前后端分离项目的条件下将验证码进行储存
  16. 案例分享 | 某券商利用AI技术进行告警关联分析(上)
  17. Java识别获取pdf中文字信息(此方法任意pdf的信息都可以拿到)
  18. python中arcsec_主页
  19. 获取tomcat服务器上的部分日志
  20. 五线城市房价已大幅下跌,房地产泡沫破裂或由此开始

热门文章

  1. RTX 4090和RX 7900XT哪个好 RTX 4090和RX 7900XT差距
  2. 机器人暮色枪骑皮肤_那些年我们用过的机器人的Q技能,枪骑高调,它还是玩家们的最爱...
  3. 创建用户桌面进程(突破Session 0隔离)
  4. 【20140202】曼昆著《经济学原理》读书笔记
  5. spark day06 + day07 + day08
  6. android设置wifi区域码,Android P - WiFi 国家码设置流程
  7. 身为产品经理,你真的明白头脑风暴怎么运用吗?
  8. HT1621驱动代码详细解析
  9. JQuery制作小风车特效
  10. MySQL 基础篇 -- 视图