Python(00):有道翻译爬虫抓取升级版,解决最新版SIGN - springsnow

时间:2024-03-05 11:43:21

Python(00):有道翻译爬虫抓取升级版,解决最新版SIGN

一、引言

之前做的有道翻译爬虫接口是http://fanyi.youdao.com/translate

这个接口的爬虫当前仍然可用,但为什么还要用最新的http://fanyi.youdao.com/translate_o接口呢?

源于一件非常矛盾的事情,当翻译 【烏節文華BIG Hotel】这个词,本意是翻译成英文,结果翻译成中文,代码中无论怎么改语言翻译结果都是中文

到官网去试试,只要把翻译语言改成中文>>英文即可正常翻译成英文

为什么会出现这种情况呢?

二、操作过程

打开有道翻译网页版的调试模式一看,果然,用的接口不一样,当前有道用的translate_o接口,看来只有这个接口才能得到我想要的结果

于是乎,我的爪爪伸向了translate_o 接口

直接用原接口和参数访问,返回结果却是{"errorCode":50}。从Form Data中分析原因得知,salt,sign,ts三个参数值是动态变化的,每次请求其值都不同,这表明网站对这三个参数作出了加密反爬虫机制,若想取得数据,就必须先破解其加密机制

2.1破解反爬机制

通过观察源代码,发现fanyi.min.js很可疑,打开一看,果然salt和sign的加密位置在这里面

r就是ts参数,是时间戳i是salt,是r加上一个随机数,sign是一个md5加密

看到了吧,就是这么简单

另外,Cookie中的OUTFOX_SEARCH_USER_ID、Referer和User-Agent三个参数也是必须的

最后,把FormData中的from改成zh-CHS,to改成en

OK 成功翻译成我想要的效果

代码

#!/usr/bin/env python
# -*- coding: utf-8 –*-
# @Time    : 2019/12/4 17:00
# @Author  : ZhangYuge
# @File    : translate_yd.py

import hashlib
import random
import time
import requests

"""
向有道翻译发送data,得到翻译结果
"""


class Youdao:
    def __init__(self, msg):
        self.url = \'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule\'
        self.msg = msg
        self.ts = self.get_ts()
        self.salt = self.get_salt()

    def get_ts(self):
        # 根据当前时间戳获取ts参数
        s = int(time.time() * 1000)
        return str(s)

    def get_salt(self):
        # 根据当前时间戳获取salt参数
        s = int(time.time() * 1000) + random.randint(0, 10)
        return str(s)

    def get_sign(self):
        # 使用md5函数和其他参数,得到sign参数
        words = "fanyideskweb" + self.msg + self.salt + "n%A-rKaT5fb[Gy?;N5@Tj"

        # 对words进行md5加密

        m = hashlib.md5()
        m.update(words.encode(\'utf-8\'))
        return m.hexdigest()

    def get_result(self):
        Form_Data = {
            \'i\': self.msg,
            \'from\': \'zh-CHS\',
            \'to\': \'en\',
            \'smartresult\': \'dict\',
            \'client\': \'fanyideskweb\',
            \'salt\': self.salt,
            \'sign\': self.get_sign(),
            \'ts\': self.ts,
            \'bv\': \'a4f4c82afd8bdba188e568d101be3f53\',
            \'doctype\': \'json\',
            \'version\': \'2.1\',
            \'keyfrom\': \'fanyi.web\',
            \'action\': \'FY_BY_CLICKBUTTION\'
        }

        headers = {
            \'Cookie\': \'OUTFOX_SEARCH_USER_ID=1389460813@123.125.1.12\',
            \'Referer\': \'http://fanyi.youdao.com/\',
            \'User-Agent\': \'Mozilla/5.0 (Macintosh; Intel Mac OSX10_14_2) AppleWebKit/537.36(KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\'
        }
        response = requests.post(self.url, data=Form_Data, headers=headers)
        translate_results = response.json()
        # 找到翻译结果
        if \'translateResult\' in translate_results:
            translate_results = translate_results[\'translateResult\'][0][0][\'tgt\']
            print(f\'\t【{self.msg}】 >>> 【{translate_results}】成功!\')
            return translate_results
        else:
            print(translate_results)


def change_cn2en(keywords):
    return Youdao(keywords).get_result()


if __name__ == "__main__":
    keywords = \'我爱中国\'
    change_cn2en(keywords)