原来python还能翻译某道翻译
爬取网站四部曲
分析
当我们进入某道翻译的官网时
先打开控制台,第一时间查看请求,先判断我们需要的数据是通过Fetch/XHR还是文档直接生成的,通过这样去判断我们写脚本的方式是直接通过获取数据还是用xml去定位数据并获取
因为我们还没使用输入任何东西,不过读者可自行看看,这里主要是为了查看当我们输入后会有什么变化
分析重点请求出现的问题
首先我们先看看我们请求体有哪些给后台
我们从上图可以看到
Get
- smartresult (结果返回方式)
- smartresult (不知道)
Post - i(我们输入的)
- from(需要转换的语言)
- to(将要转成的语言)
- smartresult(结果返回方式)
- client(客户端类型)
- salt(未知)
- sign(未知)
- lts(未知)
- bv(未知)
- doctype(文档类型)
- version(版本号)
- keyfrom(请求地址)
- action(操作方式)
这里有几个不知道是什么可以我们可以多测试几个来判断有没有固定的字段
这里我们可以看到除了红圈发生了变化,其他基本上没有发生变化,所以上面那些则是我们需要解决的问题
解决问题
首页我们知道整个翻译过程是ajax实现的,所以我们可以进行调试js代码来判断参数是如何生成的
js代码调试
然后正常的输入我们要翻译的内容
很多人可能会出现和我上面这个情况一样,js代码基本上全部在一起,很难看不好分析
发现重要信息后,我们就要去看这些数据是那些变量赋值的,怎么来的,慢慢去追溯
可以看出我们需要获取的数据都是r这个变量,所以我们要追随到r是怎么获取到的**
大致都了解了就可以开始写代码了
import hashlib
import requests
if __name__ == '__main__':
appVersion = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42"
headers = {
'User-Agent': "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42",
"x-requested-with": "XMLHttpRequest",
"origin": "https://fanyi.youdao.com",
"referer": "https://fanyi.youdao.com/",
"Cookie": "OUTFOX_SEARCH_USER_ID=1416423765@10.112.57.88; OUTFOX_SEARCH_USER_ID_NCOO=901309710.0569204; ___rl__test__cookies=1663754125840"
}
text = """
软件学堂 :http://www.xue51.com/
软件学堂为你提供最安全的PC软件下载和免费的Mac软件下载,还有单机游戏,手机游戏,手机应用软件下载,同时收集整理了各类软件使用教程、最新游戏攻略、游戏地图及游戏辅助工具供用户下载。
百度一下“软件学堂”,惊喜等着您哦!
"""
bv = hashlib.md5(appVersion.encode()).hexdigest()
ts="1663754314152"
salt="16637543141524"
s="fanyideskweb" + text + salt + "Ygy_4c=r#e#4EX^NUGUc5"
sign=hashlib.md5(s.encode()).hexdigest()
data = {
"from": "auto",
"to": "auto",
"i": text,
"smartresult": "dict",
"fr": "browser_pc",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"lts": ts,
"bv": bv,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_CLICKBUTTION",
}
url="https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
content = requests.post(url, headers=headers, data=data).json()
translateResultStr=""
for value in content['translateResult']:
for v in value:
translateResultStr+=v['tgt']
translateResultStr+='\n'
print("原文:")
print(text)
print("翻译结果:")
print(translateResultStr)