zoukankan      html  css  js  c++  java
  • 【Python项目实战】爬虫核心技术-有道翻译js逆向解析,不再做一个基础的爬虫代码书写者!

    有道翻译js逆向解析

    爬取目标

    网址:有道翻译 image.png

    工具使用

    开发工具:pycharm

    开发环境:python3.7, Windows10

    使用工具包:requests,random,hashlib

    重点学习内容

    • 网络请求的发送
    • js代码调试
    • js代码解析逆向

    项目思路解析

    先区分数据的加载方式 请求数据时网址是没有变化的 通过抓包获取到动态数据

    找到对应的数据接口 获取到网页的请求接口 请求方法是post请求

    image.png

    post需要提交的数据

    image.png

    可以明显看出salt是时间戳 多个请求的数据进行比较 只有sign值是在不断变化的加密数据 找到数据的加密规则 找到加密文件

    image.png

    打上断点找到对应加密数据的位置 调试代码进入断点

    image.png

    sign值是由r.sign得来的 找到r的生成方式

    image.png

    找到最终的加密数据的位置

    image.png

    ts为时间戳

    salt为时间戳加一个随机数 sign为MD5的加密方法生成的数据 sign是由时间戳的改变而改变的

    明确加密的方式剩下的就是书写代码了

    简易源码分析

    import time
    import random
    import hashlib
    
    
    
    def main():
        """主程序"""
        url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
        headers = {
            'X-Requested-With': 'XMLHttpRequest',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
            'Origin': 'http://fanyi.youdao.com',
            'Referer': 'http://fanyi.youdao.com/',
            'Cookie': 'OUTFOX_SEARCH_USER_ID=-1808168645@10.108.160.208; JSESSIONID=aaaRyVJv8oEwg7dPaWrux; OUTFOX_SEARCH_USER_ID_NCOO=704285648.1294403; ___rl__test__cookies=1602406917270'
        }
        i = input("请输入你要的数据:")
        """获取参数"""
        lts = str(int(time.time()*100))
        salt = lts + str(random.randint(0, 9))
    
        content = "fanyideskweb" + i + salt + "]BjuETDhU)zqSxf-=B#7m"
        sign = hashlib.md5(content.encode("utf-8")).hexdigest()
        data = {
            'action': 'FY_BY_CLICKBUTTION',
            'bv': '9caf244986fe6d1de38207408302e500',
            'client': 'fanyideskweb',
            'doctype': 'json',
            'from': 'AUTO',
            'i': i,
            'keyfrom': 'fanyi.web',
            'lts': lts,
            'salt': salt,
            'sign': sign,
            'smartresult': 'dict',
            'to': 'AUTO',
            'version': '2.1'
        }
        response = requests.post(url=url,headers=headers,data=data)
        print(response.json()["translateResult"][0][0]["tgt"])
    
    
    
    if __name__ == '__main__':
        main()
    复制代码

    每日分享,喜欢的看主页和多多点赞收藏加关注~~蟹蟹 



    每日分享,喜欢的看标题和多多点赞收藏加关注~~蟹蟹
  • 相关阅读:
    linux下ls出现文件的后缀有@,* ,/之类的解释
    对shell中cat 和EOF的理解
    linux中test的意义 又可以表示为[]
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程
    进程的创建和结束
    同步异步阻塞非阻塞
    进程的并行和并发
    进程的调度
    进程基础
  • 原文地址:https://www.cnblogs.com/nanhe/p/15093963.html
Copyright © 2011-2022 走看看