反反爬实战网易有道翻译(免费即时的多语种在线翻译)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反反爬实战网易有道翻译(免费即时的多语种在线翻译)相关的知识,希望对你有一定的参考价值。
前言
Python开发中,总是遇到不会的单词,有道翻译用着还不错,慢慢滴我便对 Ta 动了歪心思 (* ̄︶ ̄)
1. 分析页面
翻译链接:网易有道翻译
-
首先按下F12进入开发者模式,进入Network,进行数据抓包。
-
复制一句话,粘贴入查询框,会自动进行翻译,观察有哪些数据包传送过来。
-
打开服务器最先发送过来的数据包,得到翻译结果。
- 于是我复制以下post请求的相关内容,再次模拟请求时,返回error。
- 可能请求参数里面,有加密或者部分参数每次请求都会变化。
- 连续两次更换请求,对比参数变化
经过对比发现,参数salt、sign、lts
果真在变化!
- 全局search该参数,可以发现有JS代码调用:
有点猫腻了!
大概阅读JS代码,这里面有我们想要的请求参数啊!
分析这句很重要哇!
r = v.generateSaltSign(n);
往上找到 r
的产生语句:
var n = e("./jquery-1.7");
e("./utils");
e("./md5");
var r = function(e) {
var t = n.md5(navigator.appVersion)
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
}
};
有点像是我们的参数啊!
这就是生成参数salt、sign、lts
的代码。
2. Py模拟JS生成 Form Data数据
有些参数是固定的,所以直接复制就可!
def generate_formdata(self):
"""
ts: r = "" + (new Date).getTime(),
salt: ts + parseInt(10 * Math.random(), 10);,
sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
"""
ts = str(int(time.time()) * 1000)
salt = ts + str(random.randint(0, 9))
tempstr = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(tempstr.encode())
sign = md5.hexdigest()
self.formdata = {
'i': self.word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': '7596b16d0589d68d2b53a8de445f5852',
'doctype': 'json',
'version': '2.1',
'keyfrom':' fanyi.web',
'action': 'FY_BY_REALTlME'
}
3. 请求&解析数据
def get_data(self):
response = requests.post(self.url, data=self.formdata, headers=self.headers)
return response.content
def parse_data(self, origin_data): # b'{"translateResult":[[{"tgt":"Life is short, carpe diem","src":"\\xe4\\xba\\xba\\xe7\\x94\\x9f\\xe8\\x8b\\xa6\\xe7\\x9f\\xad\\xef\\xbc\\x8c\\xe5\\x8f\\x8a\\xe6\\x97\\xb6\\xe8\\xa1\\x8c\\xe4\\xb9\\x90"}]],"errorCode":0,"type":"zh-CHS2en"}'
# TypeError: string indices must be integers,因此加载为json对象
# print(type(origin_data)) # <class 'str'>
data = json.loads(origin_data)
# print(type(data)) # <class 'dict'>
return '"{}"的有道翻译结果是:{}'.format(data['translateResult'][0][0]['src'], data['translateResult'][0][0]['tgt'])
4. 完整代码
import requests
import hashlib
import time
import random
import json
class Youdao(object):
def __init__(self, word):
self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/93.0.4542.2 Safari/537.36',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-1872735395@10.108.160.105; OUTFOX_SEARCH_USER_ID_NCOO=390856101.01363164; JSESSIONID=aaaWggQObiC9694v6tDTx; ___rl__test__cookies=1629358130539',
'Referer': 'https://fanyi.youdao.com/',
}
self.formdata = None
self.word = word
def generate_formdata(self):
"""
ts: r = "" + (new Date).getTime(),
salt: ts + parseInt(10 * Math.random(), 10);,
sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
"""
ts = str(int(time.time()) * 1000)
salt = ts + str(random.randint(0, 9))
tempstr = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(tempstr.encode())
sign = md5.hexdigest()
self.formdata = {
'i': self.word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': '7596b16d0589d68d2b53a8de445f5852',
'doctype': 'json',
'version': '2.1',
'keyfrom':' fanyi.web',
'action': 'FY_BY_REALTlME'
}
def get_data(self):
response = requests.post(self.url, data=self.formdata, headers=self.headers)
return response.content
def parse_data(self, origin_data): # b'{"translateResult":[[{"tgt":"Life is short, carpe diem","src":"\\xe4\\xba\\xba\\xe7\\x94\\x9f\\xe8\\x8b\\xa6\\xe7\\x9f\\xad\\xef\\xbc\\x8c\\xe5\\x8f\\x8a\\xe6\\x97\\xb6\\xe8\\xa1\\x8c\\xe4\\xb9\\x90"}]],"errorCode":0,"type":"zh-CHS2en"}'
# TypeError: string indices must be integers,因此加载为json对象
# print(type(origin_data)) # <class 'str'>
data = json.loads(origin_data)
# print(type(data)) # <class 'dict'>
return '"{}"的有道翻译结果是:{}'.format(data['translateResult'][0][0]['src'], data['translateResult'][0][0]['tgt'])
def run(self):
# url
# headers
# formdata
self.generate_formdata()
# 发送请求,获取相呼应
origin_data = self.get_data().decode() # 将二进制byte解码为utf-8
# 解析数据
data = self.parse_data(origin_data)
print(data)
if __name__ == '__main__':
# 获取translationText
word = input('请输入您要翻译的内容(自动识别语言):')
# 创建有道翻译对象
youdao = Youdao(word)
# 执行翻译代码
youdao.run()
注意:需要反反爬虫,User-Agent加上Cookie和Referer,即可!。
可以加上:while True,这样遇到不会的词语就直接查了,各种语言都可AUTO翻译。
一直开发,一直查词,一直爽!
加油!
感谢!
努力!
以上是关于反反爬实战网易有道翻译(免费即时的多语种在线翻译)的主要内容,如果未能解决你的问题,请参考以下文章
Python 爬虫篇 - 调用有道翻译api接口翻译外文网站的整篇西班牙文实战演示。爬取西班牙语文章调用有道翻译接口进行整篇翻译