反反爬实战网易有道翻译(免费即时的多语种在线翻译)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反反爬实战网易有道翻译(免费即时的多语种在线翻译)相关的知识,希望对你有一定的参考价值。

前言

Python开发中,总是遇到不会的单词,有道翻译用着还不错,慢慢滴我便对 Ta 动了歪心思 (* ̄︶ ̄)

1. 分析页面

翻译链接网易有道翻译

  1. 首先按下F12进入开发者模式,进入Network,进行数据抓包。

  2. 复制一句话,粘贴入查询框,会自动进行翻译,观察有哪些数据包传送过来。

  3. 打开服务器最先发送过来的数据包,得到翻译结果。

  1. 于是我复制以下post请求的相关内容,再次模拟请求时,返回error

  1. 可能请求参数里面,有加密或者部分参数每次请求都会变化。
  2. 连续两次更换请求,对比参数变化


经过对比发现,参数salt、sign、lts果真在变化!

  1. 全局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加上CookieReferer即可!


可以加上:while True,这样遇到不会的词语就直接查了,各种语言都可AUTO翻译。

一直开发,一直查词,一直爽!

加油!

感谢!

努力!

以上是关于反反爬实战网易有道翻译(免费即时的多语种在线翻译)的主要内容,如果未能解决你的问题,请参考以下文章

第一次作业

Python反编译调用有道翻译(附完整代码)

Python 爬虫篇 - 调用有道翻译api接口翻译外文网站的整篇西班牙文实战演示。爬取西班牙语文章调用有道翻译接口进行整篇翻译

python百度翻译爬虫

python爬有道翻译

爬虫案例之网易有道翻译JS代码复杂版