分析百度翻译接口,使用python获取翻译结果

目标:获取百度翻译结果

工具:chrome/firefox浏览器、pychram、python3.7

模块:requests、re、execjs

开始分析:

首先在翻译页面左边输入字符串,会自动检测语言并将翻译结果显示在右边,这个过程页面并没有刷新,所以分析应该是ajax请求了接口获取的结果,直接筛选XHR,发现最后一个请求就是翻译结果接口;

既然接口找到了,接下来就是分析看传递了哪些参数,一共八个参数:

from: zh
to: en
query: 你好
transtype: realtime
simple_means_flag: 3
sign: 232427.485594
token: c156c49e36c6a5d8625e1919bf915c6e
domain:common

参数from、to:多次尝试后发现分别是原文语言和翻译语言的简称;
参数query:翻译原文;
参数transtype:应该是翻译类型,多次尝试发现有两种结果realtime和translang;
参数simple_means_flag:固定值;
参数sign:应该是js生成的;
参数token:应该也是一段js生成的字符串;
参数domain:固定值。

参数初步分析完成,固定值不用改,现在只需要知道sign和token是怎样生成的就行。

通过搜索sign,发现这个index_4029c2d.js文件中sign调用函数y(n)传入了一个n

打个断点调试看看,发现这个n其实就是需要翻译的原文

继续往下调试,发现函数y其实就是这个函数e,通过函数e、函数n加密后得到sign,ok,接下来将代码复制出来测试,经过js调试发现这段代码报错

浏览器调试看了下,i 就是window全局对象gtk , u=gtk

再次搜索gtk,找到gtk对比前面浏览器调试u的值,发现果然一模一样,这个值就是翻译页面加载出来的,直接请求这个页面正则匹配就能获得gtk,那么也就解决了获取gtk问题

将js代码变量u直接赋值为这个值放到js调试,看是否和浏览器得到的结果一样。

通过对比,发现一模一样,至此sign参数搞定,利用这段js代码就可以生成sign

接下来分析token参数,刚刚搜索sign其实已经知道(不清楚的回到上面搜索sign那里看看),token参数是从window全局对象common中获取的,通过搜索发现,token其实和gtk是在同一个页面,那么一样使用正则匹配就能拿到

通过再次对比,确认sign和token参数获取方式都没错,参数分析完成,开始写代码

逻辑梳理:
请求翻译页 => 获取gtk、token => 生成sign => 请求翻译接口 => 解析得到翻译结果

代码:

import requests
import re
import execjs
from requests.packages.urllib3.exceptions import InsecureRequestWarning# 关闭ssl验证错误提醒
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)class FanYi:def __init__(self, keyword):self.keyword = keywordself.url = ['https://fanyi.baidu.com/?aldtype=16047','https://fanyi.baidu.com/v2transapi?']self.session = requests.session()self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36','referer': 'https://fanyi.baidu.com/?aldtype=16047','origin': 'https://fanyi.baidu.com',}def key_parameter(self):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}response = self.session.get(self.url[0], headers=headers, verify=False).content.decode()# 获取页面中的token/gtktoken = re.findall("token: '(.*?)',", response)[0]gtk = re.findall("window.gtk = '(.*?)';", response)[0]# 读取jswith open('baidu.js', 'r') as f:js = f.read()# 生成js对象exec_obj = execjs.compile(js)# 调用js中的e函数并传入参数生成signsign = exec_obj.call("e", self.keyword, gtk)return token, signdef form_data(self, token, sign):data = {'from': 'zh','to': 'en','query': self.keyword,'transtype': 'realtime','simple_means_flag': 3,'sign': sign,'token': token,'domain': 'common'}return datadef run(self):# 调用两次key_parameter函数以保证token为最新的,否则请求不到数据self.key_parameter()token, sign = self.key_parameter()form_data = self.form_data(token, sign)data = self.session.post(self.url[1], headers=self.headers, data=form_data, verify=False).json()result = data['trans_result']['data'][0]['dst']print('翻译结果:', result)if __name__ == '__main__':word = input('请输入原文: ')fy = FanYi(word)fy.run()

大功告成,运行后可以成功获取到翻译结果。

遇到的问题:之前运行后一直不行,发现是token问题,获取两次token,使用第二次的token就行了,可能是百度的反爬?另外貌似还是有个问题,会偶尔请求失败,需要重新运行,目前原因不明,百度反爬措施还是挺多的。。。

总结:总之完成了翻译结果获取,其中的重点就是sign参数的获取,需要层层分析,打断点调试、抠js代码(js我还是比较菜。。。)分析完后这篇文章也最终干货满满。另外js代码就不放出来了,直接按我上面的方法就能找到js代码直接复制到一个文件中就行,把代码中的 u(这个值其实固定死也行,貌似浏览器上面也是固定的)赋值一下就行。

所有代码

Python爬虫:百度翻译接口获取翻译结果相关推荐

  1. python爬虫 + 百度地图api 获取城市的实时路况信息

    ​ 前言:本文写作的初衷是笔者参与了一个道路实况图的制作项目中,本人负责路况数据的抓取,本来是想要用高德地图的api来进行数据的抓取,但是很不巧的是 - 高德地图的路况查询api服务已经不能用了,于是 ...

  2. python有道自动翻译_Python 调用有道翻译接口实现翻译

    最近为了熟悉一下 js 用有道翻译练了一下手,写一篇博客记录一下,也希望能对大家有所启迪,不过这些网站更新太快,可能大家尝试的时候会有所不同. 首先来看一下网页 post 过去的数据 大家不难发现,我 ...

  3. 使用Python调用有道翻译接口实现翻译任务

    使用Python调用有道翻译接口实现翻译任务 首先直接上代码,可以直接复制调用 import hashlib import random import timeimport requestsclass ...

  4. python代码示例百度云-python利用百度云接口实现车牌识别的示例

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开 ...

  5. Python爬虫百度云加速验证码问题

    Python爬虫百度云加速验证码问题 问题描述 解决思路 实现代码 最终结果 问题描述 第一篇博文:低手,刚学,求勿喷. 前段时间,使用爬虫访问一个磁力链接下载网站(target_url),收集电影下 ...

  6. python 人脸比对,python 使用百度AI接口进行人脸对比的步骤

    1. 注册百度云账号 注册百度智能云,提交申请. 创建应用获取AppID,API Key,Secret Key. 2. 安装baidu python api 人脸对比 API 文档 pip insta ...

  7. python利用百度云接口实现文字OCR功能

    python利用百度云接口实现文字OCR功能 1. 前言 在日常生活中有时我们需要从图片中获取文字,虽然QQ上面已经有了相关的功能,但是出于学习的目的,我打算利用百度智能云的文字OCR接口来实现OCR ...

  8. 九十三、Python使用百度云接口API实现截图,文字识别和语音合成

    @Author:Runsen @Date:2020/7/13 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. python用百度云接口实现植物识别和动物识别

    一些先验知识可以查看上面的博客 python用百度云接口实现黑白图片上色 新建AipImageClassify AipImageClassify是图像识别的Python SDK客户端,为使用图像识别的 ...

最新文章

  1. minifilter
  2. 系统开发小结【未完待续】
  3. 华科开源多目标跟踪(MOT)实时新SOTA:FairMOT
  4. nginx学习文档之三 nginx常用命令
  5. Linux01-BASH脚本编程之信号捕捉及任务计划53
  6. 怎么下载python的各种库_各种Python库安装包下载地址与安装过程详细介绍(Windows版)...
  7. 目标检测算法——小目标检测相关数据集(附下载链接)
  8. java连连看开题报告_JAVA连连看
  9. 云聚创新力量,助力多云互联:Tungsten Fabric在联通沃云峰会2019上分享开源SDN
  10. 生成二维码与条形码的各种方法
  11. Monitor(管程)是什么意思?Java中Monitor(管程)的介绍
  12. Redis学习总结和相关资料
  13. html语言margin,margin在html中的意思
  14. 《少年编程反汇编逆向调试入门》录制成功
  15. 构建之法前三章读后感—软件工程
  16. C++程序设计课程同步项目——循环结构程序设计项目任务二
  17. 血液采样卡技术参数_使用不同采样技术的信用卡欺诈检测
  18. 关于HAL中的__weak详解
  19. 向量、矩阵乘法的几何意义(二) 矩阵乘法(Matrix Multiplication)
  20. python1 2 100_GitHub - smm113522/Python-100-Days: Python - 100天从新手到大师

热门文章

  1. ps切图保存所有切片为jpg等统一格式
  2. 2017十大科技关键词 人工智能依然火热
  3. 更新并关机怎么关闭计算机,win10关机并更新能取消吗 win10更新并关机怎样关闭...
  4. 申宝概述周五A股大盘指数虽站稳3500点
  5. 11-Linux中批量解压缩rar文件
  6. 7.MPLS VP恩 后门链路shamlink
  7. 【解决方案】如何基于EasyDSS直播点播系统快速搭建VR直播平台?
  8. CSS3:2D转换(基础)
  9. 运用CDO对NC文件插值(更改分辨率)
  10. 计算机休眠后无法启动,电脑休眠后硬盘无法启动怎么办【解决方法】