python 百度翻译爬虫(可翻译句子及文章)

  • 创作背景
  • 思路讲解
    • 第一步 寻找接口
    • 第二步 查看参数
    • 第三步 构造 sign
      • 1. 找到生成 `sign` 的文件
      • 2. 找到生成 `sign` 的函数
        • 第一张图片
        • 第二张图片
      • 3. 分析生成 `sign` 的函数
      • 4. 使用生成 `sign` 的函数
    • 第四步 进行翻译
  • 一些问题的解决
  • 总结
  • 结尾
  • 声明:本文 仅限爬虫学习 ,不得 将本文代码商用侵权删
  • 如果喜欢本文的话,可不可以给我 点个关注点个赞评论 + 收藏 (☆▽☆)

创作背景

  • 本菜鸡最近要整个 批量翻译词组和句子 ,准备调用 百度翻译 的接口,以前也搞过,用的 这个接口,但是只能 翻译单词 ,没法满足需求,所以就需要重新搞。
  • 其实以前我就对 这个接口 念念不忘,但是因为当时啥也不会(虽然现在也是),为了图省事儿就没搞,今天 必须拿下 !!!

思路讲解

本文 js 逆向 参考 这个大佬的这篇文章 。

第一步 寻找接口

无非是 按 F12 打开开发者工具寻找对应的接口 ,具体情况在此不多赘述。

第二步 查看参数

该请求是 POST 请求。


其中

  • from 参数是 源语言 ,即 被翻译的文本的语言
  • to 参数是 目标语言 ,即 要翻译成的语言
  • query 参数是 要翻译的文本
  • transtype 参数是 翻译类型 ,置为 translang 即可;
  • simple_means_flag 参数不知道干啥,不用管,置为 3 即可;
  • sign 参数是 标志 ,代表 要翻译的内容的标志号 ,生成方法见后续;
  • token 参数是 记号 ,每次请求网页源码都会携带 token ,见下图;
  • domain 也不用管,置为 common 即可。

第三步 构造 sign

因为 sign 参数是根据 要翻译的文本 生成的,不同的内容对应不同的 sign ,所以我们需要找到生成 sign 的方法。

1. 找到生成 sign 的文件

这时,我们需要使用 全局搜索 查找生成 sign 的地方,如下图。

  • 每个文件大致看一遍,我就确认了 sign 生成的函数在 这个文件 中。

    • 这个文件地址和上述博主文章中的地址不太一样,是因为我想根据我自身的情况实际实践一下,当然,也可以直接使用博主文章中的地址,如果你想看看自己本地的文件,去找 https://fanyi-cdn.cdn.bcebos.com/static/translation/pkg 这个文件夹,我用的 火狐 ,在 调试器 中可以找到
    • 然后找到图中的的文件,文件名取决于 全局搜索 的结果,我的结果是这个,至此,这一步结束。

2. 找到生成 sign 的函数

上一步 copy 完代码后,我放入 Pycharm 中分析,当然,也可以放到其他编辑器中。
这时,还是 全局搜索 sign ,会搜索出很多 assign 或者 signal ,所以我们需要甄别一下,甄别过后,包含有 sign 的地方有 处,如下图。





根据图中代码我们很好判别,第一张第二张 图属于一类,代码逻辑相似,第三张图第四张图 类似,所以我们就分析 第一张第三张 的代码。

第一张图片

Pycharm 编辑器中,我们按住 ctrl 点击 d (因为这时候 sign 是根据 d 生成的),我们就跳转到 d 定义的位置了。
可以看见,是根据函数 n 传参 s 得到,而 s 是函数 t 传参一大堆生成,点击 t 的话,如下图。
匿名函数 的参数,如果全局搜索 传递给函数 t 的一大堆的参数 的话也发现不了什么,所以,这条线索 断了

第二张图片

我们同样是点击 L ,就跳转到了 L 的生成位置,如下图。

这时我们再搜索函数 t 的参数,如下图。

这时我们会发现有这个模块的定义,其中,define 函数的解释请见 这篇文章 。
说明,模块 translation:widget/translate/input/pGrab 即为生成 sign 的模块。也 符合上述博主的文章

3. 分析生成 sign 的函数

通过分析源码,我们可以了解代码逻辑,其中,u 是最终生成 sign 的关键。
不过有个问题,我们看 u 的生成方法:

u = null !== i ? i : (i = window[l] || "") || "";

其中,i 很好得到,因为这个函数下边有 i 的定义:

var i = null;

这样的话,那按照代码逻辑,上边 u 的定义应该是这样:

u = (i = window[l] || "") || "";

这时候,关键就在于参数 ll 的定义在上一句:

var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);

l 是个字符串,通过 console.log() 输出一下 l 的值,是

  • 对了,插一句,在 Pycharm 中运行 js 代码应该安装 Nodejs ,稍后我会专门写一篇文章。
    我们在 Pycharm 中无法查看 window 的值,所以我们就在浏览器的控制台输入 window ,查看它的值:

    诶,还真被我找到了值,那我们就可以把这个值赋给 i ,这样 u 直接就是 i ,也就是图中的数据。

4. 使用生成 sign 的函数

既然只有这个函数是对我们来说有用的,那就把它 copy 到一个 js 文件中,使用 python 的第三方库 execjs 执行 js 代码,即:

var i = "320305.131321201";function a(r) {if (Array.isArray(r)) {for (var o = 0, t = Array(r.length); o < r.length; o++) t[o] = r[o];return t}return Array.from(r)
}function n(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 e(r) {var o = r.match(/[�-�][�-�]/g);if (null === o) {var t = r.length;t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))} else {for (var e = r.split(/[�-�][�-�]/), C = 0, h = e.length, f = []; h > C; C++) "" !== e[C] && f.push.apply(f, a(e[C].split(""))), C !== h - 1 && f.push(o[C]);var g = f.length;g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))}var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);console.log("l:", l);u = null !== i ? i : (i = window[l] || "") || "";for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {var A = r.charCodeAt(v);128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)), S[c++] = A >> 18 | 240, S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224, S[c++] = A >> 6 & 63 | 128), S[c++] = 63 & A | 128)}for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + 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)), b = 0; b < S.length; b++) p += S[b], p = n(p, F);return p = n(p, D), p ^= s, 0 > p && (p = (2147483647 & p) + 2147483648), p %= 1e6, p.toString() + "." + (p ^ m)
}

既然有函数,那我们就不必具体分析,直接用就好了。
测试一下:


一模一样!!!
使用 execjs 测试,测试代码如下:

import execjswith open('sign.js', encoding='utf-8') as f:js_code = f.read()
create_sign = execjs.compile(js_code)
print(create_sign.call('e', 'year'))


成功!!!

第四步 进行翻译

请求的时候有 反爬,所以 CookieUser-Agent 一个都不能少,代码如下:

import json
import execjs
import requestswith open('sign.js', encoding='utf-8') as f:js_code = f.read()create_sign = execjs.compile(js_code)def translate(kw):data = {'from': 'en','to': 'zh','query': kw,'transtype': 'translang','simple_means_flag': 3,'sign': create_sign.call('e', kw),'token': '【用自己的】','domain': 'common'}headers = {'Cookie': '【用自己的,别想白嫖我的】','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'}res = requests.post('https://fanyi.baidu.com/v2transapi?from=en&to=zh', data=data, headers=headers)print(res.json())translate('year')

结果如下:

特别多,我们只要想要的数据,一般是 data 列表中的 第一个数据

print(res.json()['trans_result']['data'][0])

结果如下:

成功完成任务!!!

一些问题的解决

  • sign 生成错误解决方案

总结

这是本菜鸡 第一次 成功的完成 js 逆向逆向 之路,道阻且跻,但我仍要不断前行。




结尾

有想要一起学习 python 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。

python 百度翻译爬虫(可翻译句子及文章)(偷偷说一句,保姆级教程哦)相关推荐

  1. Python百度文库爬虫之txt文件

    Python百度文库爬虫之txt文件 说明: 对于文件的所有类型,我都会用一篇文章进行说明,链接: Python百度文库爬虫之txt文件 Python百度文库爬虫之doc文件 Python百度文库爬虫 ...

  2. 爬虫保姆级教程3:利用python-Flask框架搭建本地数据可视化网站

    成果展示: (1)网站首页: (2)电影表单页 (3) 电影评分页 (4) 词频统计页 (5)团队页面 接下来让我们看看上述网站是如何完成的: 首先简单介绍一下Flask框架: Flask主要功能有两 ...

  3. 金融数据获取:当爬虫遇上要鼠标滚轮滚动才会刷新数据的网页(保姆级教程)

    目录 1. 谁这么会给我整活儿 2. Selenium模拟网页浏览器爬取 2.1 安装和准备工作 2.2.1 高度判断 2.2.2 顶部距离判断 3: 爬取内容 4: 完整代码,结果展示 1. 谁这么 ...

  4. 保姆级教程!将 Vim 打造一个 IDE (Python 篇)

    从上周开始我就开始折腾 ,搞了一下 Vim IDE for Python & Go,我将整个搭建的过程整理成本篇文章分享出来,本篇是 Python 版本的保姆级教程,实际上我还写了 Go 版本 ...

  5. 【图解SHA1杂凑算法】SHA1杂凑算法的Python实现保姆级教程 | 物联网安全 | 信息安全

    系列索引:[图解安全加密算法]加密算法系列索引 Python保姆级实现教程 | 物联网安全 | 信息安全 起初写实验时找到的代码大多基于c/c++,python可参考的资料很少,所以借着这次实验的机会 ...

  6. Flutter开发百度地图之定位,保姆级教程(2)

    未经本人同意,禁止转载! 前几天开发flutter百度地图,总算是把第一步走通了,这几天把定位功能开发了一下.记录一下,所谓取之于CSDN用之于CSDN. 下面描述的工程是配置Android的,ios ...

  7. 保姆级教程如何用Xcode搭建python环境

    保姆级教程如何用mac电脑中的Xcode搭建python环境(xcode12) 「mac电脑自带python2.7,你也可以更新你的python版本」 打开Xcode,点击file-new-proje ...

  8. 电脑技巧 之 Discord翻译插件(PC端)(保姆级教程)

    办法有2种, 一种是通过谷歌浏览器登录Discord , 利用油猴的翻译插件来实时翻译; 一种是Discord.exe,安装翻译插件,设置自动翻译; 以上均需要科学上网; ** 网页端Discord ...

  9. python 公众号爬虫_整理公众号文章?Python爬虫让一切变的简单……

    有时候公众号文章需要进行整理分析,要把所有文章的链接整合起来还真不是一个容易的事情!手动整理固然简单,但文章数量多起来整理还真不是一件容易的事情. 这个时候我们可以用到神器Python,定制爬虫的指定 ...

  10. 【Python安装-保姆级教程】马哥手把手教你安装Python并配置pycharm环境

    目录 一.安装Python解释器 二.安装.配置Pycharm 三.获取安装文件 本文首发公众号「老男孩的平凡之路」 您好,我是 @马哥python说 ,一枚10年程序猿. 我的社群中小白越来越多,咨 ...

最新文章

  1. multiprocessing python_Python多线程/进程(threading、multiprocessing)知识覆盖详解
  2. 想学python都要下载什么软件-学编程闲余时间建议下载的软件_Python新手入门教程...
  3. JAVA String 相加编译器发生了什么?
  4. DS1302时钟芯片在STM32F0中的完整应用代码
  5. 【C++】this指针
  6. butterknife 插件_知道这个插件,能让你的项目里少写1000行代码
  7. Java 打包 FatJar 方法小结
  8. java assembly 打包_maven 使用assembly 进行打包的方法
  9. 安卓 usb音量调节_戴尔推出面向Teams和Zoom视频通话的USB-C免提适配器
  10. Python中过滤序列内置函数filter()的详解(常用)
  11. RESTful最佳实践
  12. 21.docker logs
  13. 最详细的联发科刷机教程MediaTek SP Flash Tool教程MTK通用驱动Windows 10 MTK VCOM USB Preloader Drivers
  14. java毕业设计论文题目javaweb图书借阅管理系统[包运行成功]
  15. FudanNLP学习实例——中文分词部分
  16. book回车键 mac_macbook pro键盘失灵 macbook pro键盘失灵解决办法
  17. 如何应用计算机键盘截图,键盘怎么截图快捷键_键盘上截屏是哪个键-win7之家
  18. 云空间插html音乐,【详细教程】如何在空间中引用网易云音乐
  19. PDF文件进行在线分割如何去操作
  20. 【华为云技术分享】敏捷设计,高效协同,凸显设计端云协同价值

热门文章

  1. 20210729 线性增长条件和全局Lipschitz条件的关系
  2. Heartbeat安装部署
  3. 中国区边界shp文件以及STRM 90m DEM分享(百度云免费下载链接)
  4. java 阴阳历,Java基础-有意思的阴阳历互换的算法
  5. 检察机关认定河北涞源反杀案为正当防卫 决定不起诉女生父母
  6. 前端几种本地缓存机制
  7. 《逆流而上的你》大结局将至,邹凯高蜜何去何从
  8. 自己怎么制作地图,如何绘制电子版地图?
  9. http Headers字段汇总
  10. WSAData结构体的作用