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 json

url = '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)

运行结果为:
请添加图片描述
注:仅供学习,切莫用于商业活动!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring | Spring的基本应用

目录: 1.什么是Spring&#xff1f;2.Spring框架的优点3.Spring的体系结构 (重点★★★) :3.1 Core Container (核心容器) ★★★Beans模块 (★★★) : BeanFactoryCore核心模块 (★★★) : IOCContext上下文模块 (★★★) : ApplicationContextContext-support模块 (★★★)SpE…

Mongoose 开源库--http协议 header 报头解析

一、http 协议 header 报头相关 API 获取http header的值 struct mg_str *mg_http_get_header(struct mg_http_message *hm, const char *name);参数&#xff1a; hm - HTTP message to look for header name - Header name返回值&#xff1a; HTTP header value or NULL i…

Docker下安装MySQL

如果在Docker下直接拉取MySQL并运行镜像&#xff0c;由于没有指定字符编码集&#xff0c;可能会存在插入中文出现乱码的情况&#xff0c;并且当容器删除后&#xff0c;容器里面存在的数据会丢失&#xff0c;所以在运行容器时应该使用数据卷进行挂载&#xff0c;按照如下步骤操作…

智慧城市包括哪些内容?有哪些智慧城市物联网方案?

数字城市、智慧城市的发展&#xff0c;离不开对公共基础设施的数字化、智慧化改造升级。通过融合边缘计算、5G、物联网、数字孪生、人工智能等新一代信息技术&#xff0c;助力传统公共基础设施提升增强全流程数据能力、计算能力、服务能力&#xff0c;从而不断丰富公共基础设施…

Kotlin:内置函数let、also、with、run、apply

前言 在Kotlin中&#xff0c;有一些用于扩展 & 方便开发者编码的内置函数&#xff0c;能大大提高开发者的开发效率。今天&#xff0c;我将主要讲解的是&#xff1a; let函数also函数with函数run函数apply函数 基础知识&#xff1a;接口回调中Lambda使用 在Kotlin中可使用…

IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

文章目录 前言即时通讯常用技术 短轮询&#xff08;Short Polling&#xff09;实现原理优点缺点 长轮询(Long Polling)实现原理改进点基于iframe的长轮询实现原理总结 Server-Sent Events&#xff08;SSE&#xff09;实现原理浏览器对 SSE 的支持情况SSE vs WebSocket总结 WebS…

Fisher信息理论与应用

一、概念介绍 Fisher信息量&#xff0c;是一次观测值所能提供的关于未知参数θ的信息量期望值的一种度量。 Fisher信息矩阵&#xff0c;是用利用最大似然函数估计来计算方差矩阵&#xff0c;表示随机变量的一个样本所能提供的关于状态参数在某种意义下的平均信息量。 Fisher…

Python---练习:列表赋值---追加append尾部追加元素,追加的是一个元素整体

相关链接&#xff1a; Python--列表及其应用场景---增、删、改、查。-CSDN博客 代码&#xff1a; # 列表赋值 a [1, 2, 3] a.append([3, 4]) # append尾部追加元素&#xff0c;追加的是一个元素整体&#xff1a;[3, 4] print(a)

Java实现简单飞翔小鸟游戏

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为飞翔的鸟。 其次在飞翔的鸟项目下创建一个名为images的文件夹用来存放游戏相关图片。 用到的图片如下&#xff1a;0~7&#xff1a; bg&#xff1a; column&#xff1a; gameover&#xff1a; ground&#xff1a; st…

Java数据结构 之 包装类简单认识泛类

生命不息&#xff0c;奋斗不止 目录 1. 什么是包装类&#xff1f; 1.1 装箱和拆箱 1.2 自动装箱和自动拆箱 2. 什么是泛型 3. 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 4.3 类型推导(Type Inference) 5. 裸类型(Raw Type) &#xff08;了解&#xff09…

使用docker切换任意版本cuda使用GPU

1.现存问题 在主机上运行很多下载来的机器学习代码时&#xff0c;这些大都运行在不同版本的tensorflow-gpu或者pytorch等的包下的。但是&#xff0c;运行代码的过程中&#xff0c;存在匹配的问题&#xff1a; 1.不同的版本的tensorflow-gpu或pytorch对cuda版本的适配也不一样…

优化邮件群发效果的策略与方法

怎样优化邮件群发效果&#xff1f;这是许多企业在进行邮件营销时常常被问到的问题。邮件营销是一种高效且经济实惠的市场推广方式&#xff0c;但如何使邮件真正引起接收者的兴趣并产生预期的效果并不容易。好的营销效果可以带来高回报、高收益率&#xff0c;但是怎么提升群发效…

专升本期间部分C语言程序整理

说明 这些程序是我在专升本期间在CSDN上上传的作业、练习等&#xff0c;仅为学习备考的一小部分程序&#xff0c;整理成一篇文章&#xff0c;方便专升本的学弟学妹参考。 时间&#xff1a;2021年~2022年专升本期间 字符串题 输入字符串提取 数字字符 并 求和 &#xff08;4处…

【最通用版FPGA 实现 SPI 驱动】

最近研究了一下SPI协议的FPGA实现&#xff0c;发现网上很多大佬分享的方法都是针对某一特定的flash芯片或者某一传感器芯片来设计电路结构的。所以想根据SPI&#xff08;Serial Peripheral Interface&#xff09;的基本通讯协议实现一个通用版的SPI Master驱动。SPI在嵌入式领域…

每天一点python——day84

#每天一点Python——84 #异常处理机制try—except—else #异常处理机制try—except—else如果try块中没有抛出异常&#xff0c;则执行else块&#xff0c;如果try中抛出异常&#xff0c;则执行except块#示例&#xff1a; try:a int(input(请输入第一个整数&#xff1a;))b in…

controller能接收到数据有数据但是前端无法显示数据

又是制作系统时遇到的问题。只是想做个查询商品的页面&#xff0c;结果弄了一天&#xff0c;在网上各种查问题&#xff0c;各种解决办法用在我的代码上&#xff0c;换了无数种关键词搜索终于找到了一条成功解决了问题。 问题描述&#xff1a; 事情是这样的&#xff1a;我要写一…

无代码集成航天信息:优化电商平台用户运营,提高CRM和广告推广的效能

无代码开发的集成优势 在数字化竞争愈发激烈的商业市场中&#xff0c;企业对于提高效率和优化用户运营的需求不断增长。无代码开发的集成解决方案&#xff0c;如航天信息电子发票&#xff0c;为企业提供了无需深入编程知识即可快速实现的系统对接能力。这种集成方式简化了技术…

没了解死锁怎么能行?进来看看,一文带你拿下死锁产生的原因、死锁的解决方案。

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是死锁产生的原因&#xff0c;以及如何解决死锁问题。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起…

Hdoop学习笔记(HDP)-Part.09 安装OpenLDAP

目录 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 …

[蓝桥杯 2019 省 B] 特别数的和-C语言的解法

小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的和是多少&…