• 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'	【{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)
  • 相关阅读:
    软件工程-事后Postmortem 会议
    软件工程-项目复审
    团队作业-冲刺博客(日更)
    团队作业-冲刺博客(任务与计划)
    团队作业-需求改进&系统设计
    软件工程团队作业-需求规格说明书
    TooBug,出撃!
    FileReader
    Javascript刷新页面的几种方法:
    软件工程-个人项目
  • 原文地址:https://www.cnblogs.com/springsnow/p/12553888.html
Copyright © 2020-2023  润新知