Python爬虫:通过js逆向分析某翻译网站的原理

Python爬虫:通过js逆向分析某翻译网站的原理

        • 1. 网站实现原理
        • 2. 抓取接口
        • 3. 参考代码和运行结果

1. 网站实现原理

首先,说一下爬取的网站:百度翻译。网站实现翻译的效果是通过接口实现的,也就是各位听到的ajax技术(只需要更换对应参数,就可以实现网站部分刷新的效果,不需要刷新整个网页)。
下面演示的是 中文 到 英文的翻译。
请添加图片描述
这个接口的响应数据经过一定的解析,最后就是我们网页上看到的那种翻译结果了。
请添加图片描述

2. 抓取接口

请求接口为:https://fanyi.baidu.com/v2transapi?from=zh&to=en
请求参数如下:

from: zh
to: en
query: 笑
transtype: realtime
simple_means_flag: 3
sign: 852202.648155
token: ab7c42fced834521400ca9c95a3b5bde
domain: common
ts: 1701589808240

请求参数中需要注意的参数有sign、query、ts,其他参数的值可以说均是固定的,或者说因为浏览器的原因或者其他原因可能有所不同。
query的值也就是我们输入的需要翻译的词,sign的值需要根据query的值进行一定处理,ts就是当前时间的时间戳而已。通过js逆向可以发现,这些值产生的js代码在这:
请添加图片描述
其中b为一个js函数,如下:
请添加图片描述
经过进一步处理,最终得到js代码如下:
请添加图片描述
当然,上述js代码简化可能存在一定的问题吧!但是对于简单词句的翻译,达到正确翻译效果应该没有问题。

3. 参考代码和运行结果

没有的模块需要提前下载,比如requests、execjs、json。关于请求头的字段,这里讲述一下,User-Agent用于把当前请求模仿成一个正常的浏览器访问行为,Content-Type只是说一下请求参数的格数而已,Cookie和User-Agent效果一样,不添加这个字段访问会失败的哈!

# -*- coding: utf-8 -*-
import requests
import execjs
import time
import jsonurl = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","Cookie": "BDUSS=UZkdDdSLXBHeFNoQVJ4OHZmVUxYbGYxQ1NmNzB-fnVXZklSVGRZWVRZNXIzcFJoRVFBQUFBJCQAAAAAAAAAAAEAAADQ51LqX7PW1q7S1LrjX2xpdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtRbWFrUW1hd; BDUSS_BFESS=UZkdDdSLXBHeFNoQVJ4OHZmVUxYbGYxQ1NmNzB-fnVXZklSVGRZWVRZNXIzcFJoRVFBQUFBJCQAAAAAAAAAAAEAAADQ51LqX7PW1q7S1LrjX2xpdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtRbWFrUW1hd; PSTM=1642905086; BIDUPSID=23BF0A276A7CC6017B58F438A11C7155; REALTIME_TRANS_SWITCH=1; BAIDUID=003C5186D83049E7851C40AFB3AC0BED:SL=0:NR=10:FG=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS_BFESS=39671_39672_39664_39676_39713_39741_39780_39789_39704_39682_39678_39818_39837_39843; ZFY=2QTXGhhFbz:B51omwOyXYTQSuCe0aEOR8YRpzrM8oc:Bs:C; BAIDUID_BFESS=003C5186D83049E7851C40AFB3AC0BED:SL=0:NR=10:FG=1; H_PS_PSSID=39676_39713_39741_39780_39789_39704_39682_39678_39818_39837_39843; H_WISE_SIDS=39676_39713_39741_39780_39789_39704_39682_39678_39818_39837_39843; ET_WHITELIST=etwhitelistintwodays; BA_HECTOR=a0ag2h2g2105a1208h2lah0m1imlmus1r; BDRCVFR[S_ukKV6dOkf]=mk3SLVN4HKm; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1701152555,1701310864,1701485544,1701572131; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1701572139; ab_sr=1.0.1_YzA0MjVlNDQyMGJmMmVjMTJmYjUyOWI2ODU1MWUzNzA5ZGY5NTc2YzI5MzE4MWFiY2UzMTkzNDUzMzFlZDYwYjVlZTgwNzRmMzZkMGNlZTJlZjU1MTQwMGNmM2U2NmMwZGVmODZlZTM5YzhiZjgzOGVkNzBjNDNjOWYwNjFjYTJhMWYxNWFhZmYzMDVkNTc2Mzc0YzI2MzQ0ZTc0ZDM5ODAzNzM0YjY3ZTk2MjRiOWVjMzA4YmNlNzJlZWZmMWFm","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.202.400 QQBrowser/11.9.5355.400",
}_js = '''
function fun1(t) {var o;var r = '320305.131321201';var a = t.length;a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))for (var d = 'gtk', h = r.split("."), f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {var _ = t.charCodeAt(v);_ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),g[y++] = _ >> 18 | 240,g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,g[y++] = _ >> 6 & 63 | 128),g[y++] = 63 & _ | 128)}console.log(g);for (var b = f, w = '+-a^+6', k = '+-3^+b+-f', x = 0; x < g.length; x++)b = n(b += g[x], w);return b = n(b, k),(b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),"".concat((b %= 1e6).toString(), ".").concat(b ^ f)
}function n(t,e){for (var n = 0; n < e.length - 2; n += 3) {var r = e.charAt(n + 2);r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),r = "+" === e.charAt(n + 1) ? t >>> r : t << r,t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r}return t
}'''
# js代码
key_word = input('输入:')
ctx = execjs.compile(_js)
sign = ctx.call('fun1', key_word)
data = {"from": "zh","to": "en","query": key_word,"transtype": "realtime","simple_means_flag": "3","sign": sign,"token": "ab7c42fced834521400ca9c95a3b5bde","domain": "common","ts": f'{int(time.time()*1000)}'
}
rsp = requests.post(url=url, data=data, headers=headers)
map = json.loads(rsp.text)
print(map)

运行结果为:
请添加图片描述
注:仅供学习,切莫用于商业活动!
上述代码,如果在请求多次的情况下,个人觉得可能会出现封ip的情况,于是可以给它加个代理,上网找了一圈,虽然有免费的代理,但是可用的很少,于是找到了价格还算优惠的ip代理网站,这个:一连代理,价格如下:
请添加图片描述
可以发现,价格还是挺优惠的,而且可以免费领取3天代理服务哈!确认订单之后,访问这个网址,即可获取对应代理ip,如下:http://api.yilian.top/v2/proxy/proxies?num=1&type=1&duration=1&token=(你的token值,购买成功之后生成的token值)
请添加图片描述
运行结果:
请添加图片描述
这个proxies中的参数参考文档来写哈!文档地址为:文档地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sharding-Jdbc(4):Sharding-Jdbc分库

1 新建数据库 创建ds_0数据库和ds_1数据库&#xff0c;在两个数据库新建表如下&#xff1a; CREATE TABLE t_order (order_id bigint(20) NOT NULL,user_id bigint(20) NOT NULL,PRIMARY KEY (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin; 2 新建maven项目…

QNX时钟调研

SYSPAGE_ENTRY()的使用&#xff0c;SYSPAGE_ENTRY 测试QNX下printf(“poo\n”);的耗时 #include <sys/neutrino.h> #include <inttypes.h> #include <stdio.h> #include <stdlib.h> #include <sys/syspage.h>int main( void ) {uint64_t cps, …

计算机网络的性能

目录 一、计算机网络的性能指标——宽带 二、计算机网络的性能指标——时延 三、计算机网络的性能指标——时延带宽积 四、计算机网络的性能指标——往返时延 五、计算机网络的性能指标——吞吐量 六、计算机网络的能能指标——利用率 计算机网络的定义&#xff1a;计算机网络时…

9. 双向队列

在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如下图所示&#xff0c;双向队列(double-ended queue)提供了更高的灵活性&#xff0c;允许在头部和尾部执行元素的添加或删除操作。 9.1 双向队列常用操作 双向队列的常用操作如下表所示&#xff0c;具体的方法名称…

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…

qt5.15播放音频示例(4种方法)

文章目录 Qt播放音频方法一 QMediaPlayer方法二 QSound方法三 QSoundEffect方法四 QAudioOutput问题1 播放无声问题2 QAudioOutput播放嗡嗡声的问题参考Qt播放音频 在linux系统中,可以通过aplay进行简单的播放音频,如 aplay /opt/Audio/test.wav在图形界面,也可以封装apla…

【接口测试】Apifox实用技巧干货分享

前言 不知道有多少人和我有着这样相似的经历&#xff1a;从写程序只要不报错就不测试&#x1f60a;&#xff0c;到写了程序若是有bug就debug甚至写单元测试&#xff0c;然后到了真实开发场景&#xff0c;大哥和你说&#xff0c;你负责的功能模块的所有接口写完要测试一遍无误在…

canvas基础:fillStyle 和strokeStyle示例

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 上色…

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度&#xff0c;作为中国最大的搜索引擎&#xff0c;其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中&#xff0c;了解自己网站…

分治-归并排序

文章目录 &#x1f31e;315. 计算右侧小于当前元素的个数&#x1f308;1. 题目⛅2. 算法原理&#x1fa90;3. 代码实现 &#x1f315;493. 翻转对&#x1f320;1. 题目⭐2. 算法原理&#x1f31f;3. 代码实现 &#x1f31e;315. 计算右侧小于当前元素的个数 &#x1f308;1. 题…

Fiddler抓包工具之fiddler设置抓HTTPS的请求证书安装

设置抓HTTPS的请求包 基础配置&#xff1a; 路径&#xff1a;启动Fiddler 》Tools》Options》HTTPS 注意&#xff1a;Option更改完配置需重启Fiddler才能生效 选中"Decrpt HTTPS traffic", Fiddler就可以截获HTTPS请求&#xff0c;如果是第一次会弹出证书安装提…

二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树

二叉树的实现 定义结构体 我们首先定义一个结构来存放二叉树的节点 结构体里分别存放左子节点和右子节点以及节点存放的数据 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;…

Kubernetes入门学习(下)

Kubernetes入门学习&#xff08;下&#xff09; 文章目录 Kubernetes入门学习&#xff08;下&#xff09;运行有状态的应用ConfigMap与SecretConfigMapSecret 卷(Volume)StatefulSet(有状态应用集)Headless Service(无头服务)Mysql主从复制Port-forward端口转发Helm参考 运行有…

Python办公自动化【Word设置文字样式、Word设置段落样式、Word生成通知书、Word读取内容】(五)-全面详解(学习总结---从入门到深化)

目录 Word设置文字样式 Word设置段落样式 Word生成通知书 Word读取内容 Word设置文字样式 常用方法与属性 函数名&属性含义docx.shared.Inches() 创建大小(英寸)docx.shared.Pt() 创建大小(像素)docx.shared.RGBColor() 创建颜色docx.text.run.Run.font.bold文字加粗…

压缩docker在主机的虚拟磁盘容量

我们在windows里使用docker时会发现&#xff0c;即使我们已经删除了无用的镜像和容器&#xff0c;主机里挂在docker虚拟磁盘的那个盘&#xff0c;可用空间也没有增加&#xff0c;这是因为虚拟磁盘不会自动缩小&#xff0c;这里我分享一个可用的解决方案。 1.先通过docker回收空…

[多线程]线程安全问题再讨论 - volatile

目录 1.引言 2.volatil关键字 2.1内存可见性 2.2指令重排序 1.引言 大家好,我是老cu,今天我们来继续聊聊线程安全问题 线程安全是我们在编程开发中遇到的非常常见,棘手 的问题.同时也是多线程部分很复杂的问题.为了线程安全我们要做很多努力.也要对线程安全部分的代码进行慎…

使用python streamlit库快速创建一个购物网站

streamlit Streamlit 是一个基于 Python 的 Web 应用程序框架&#xff0c;致力于以更高效、更灵活的方式可视化数据&#xff0c;并分析结果。 Streamlit是一个开源库&#xff0c;可以帮助数据科学家和学者在短时间内开发机器学习 (ML) 可视化仪表板。只需几行代码&#xff0c…

[GPT-1]论文实现:Improving Language Understanding by Generative Pre-Training

Efficient Graph-Based Image Segmentation 一、完整代码二、论文解读2.1 GPT架构2.2 GPT的训练方式Unsupervised pre_trainingSupervised fine_training 三、过程实现3.1 导包3.2 数据处理3.3 模型构建3.4 模型配置 四、整体总结 论文&#xff1a;Improving Language Understa…

Gossip 协议

Gossip 协议 背景 在分布式系统中&#xff0c;不同的节点进行数据/信息共享是一个基本的需求。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时共享最新信息给其他所有节点&#xff0c;比较适合中心化系统。这种方法的缺陷也很明显&…

Hdoop学习笔记(HDP)-Part.20 安装Flume

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …