最新Python爬虫有道翻译JS逆向解析详细介绍版,附源码

我的第一篇文章,写的很详细,这里方便刚接触爬虫帅哥们理解,大家一起加油

前两步为js的逆向分析过程,了解过程的请跳到第三步(源码),最后打包成exe文件

有道翻译网址:在线翻译_有道

第一步:找到有道翻译发送请求的Url地址

老规矩进去界面F12打开浏览器的抓包工具,输入测试值

 查看界面源代码发现找不到翻译内容,可以判断请求是aj二次请求或者封装在js文件里。

点击调试工具中点network(网络)选择XHR可以查考到有哪些二次请求,点击Preview能查看到相应的内容。

 

发现这里面相应的就是我们翻译的内容,然后找到Header,复制好请求的地址

Url请求地址:

 url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"      #有道翻译的请求头

发现是POSt请求,拉到最下面找到需要的参数

虽然有很多,可是我们通过多次输入内容发送请求,通过对比发现以上参数发生变化的只有salt,sign,lts这三个

只要找到salt,sign,lts加密过程再用post方式发送请求就好了。


第二步:找以上参数的加密过程

有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可


这里是:找三个变量的生成途径

打开搜索,搜索salt,打上断点 

可以在8389行发现salt是进行md5加密过后的字段

打上断点运行后:

 发现e为输入内容,i为js时间戳加上一个0-9的随机整数,变量sign分析完毕

sign=fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@ 再后用md5加密

lts:时间戳         通过前面多次输入发生请求内容时,发现its就是时间戳

salt时间戳加0-随机整数

以上三个变量都解析完毕,md5加密可以在有道翻译的js文件里面保存加密过程,再通过python的第三方execjs库去执行js文件 ,也可以直接调用hashlib 进行md5加密

搜索md5即可找到加密过程在8209行,通过发条调试js,找到所缺的函数内容后,直接写入js文件,再用execjs读取即可


第三步:用python语言改写调用接口

附代码:我这里是直接调用第三方库加密,以下代码复制粘贴可直接运行,缺失的库直接添加即可

import requests      #获取url请求
# import execjs        #node模板 用来执行js文件
import random        #随机数
import time          #用来生成python模式的时间戳
import hashlib      #md5加密模板可以直接对"fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到salt

'''有道翻译为post请求 且有salt,sign,lts三个随机变量 其他data中的为固定值,所以找到这三个变量的加密过程即可
lts:时间戳
sign:fanyideskweb" + 输入的内容(e) + i(时间戳) + "Tbh5E8=q6U3EXe+&L[4c@  再后用md5加密
salt:时间戳加0-随机整数
以上三个都为字符类型
'''
if __name__ == '__main__':
    while True:
        print('-------------------有道翻译-------------------')
        e = input('请输入需要翻译的文字:').strip()
        if len(e) and e!="" :
            rsum = str(int(random.random()*10))         #生成(0,9)的随机整数并转换成字符型
            r = str(int(time.time() * 1000))            #生成python模式下的时间戳
            i = r+rsum                                  #构造data中的salt变量  !!!!完成了salt变量的加密:时间py时间戳乘1000即js时间加上0-9的随机整数
            # node = execjs.get()
            # ctx = node.compile(open('./youdao.js',encoding='utf-8').read())
            # funcName = "getSign('{0}','{1}')".format(e,i)   #调用有道翻译的加密语法得到sign
            # sign = ctx.eval(funcName)       #fanyideskweb" + 输入的内容就是e + i + "Tbh5E8=q6U3EXe+&L[4c@" 加密得到sign

            url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"      #有道翻译的请求头
            Header = {

             'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
                        'Referer':'https://fanyi.youdao.com/',
                        'Cookie':'OUTFOX_SEARCH_USER_ID_NCOO=1328394085.0392962; OUTFOX_SEARCH_USER_ID="1796778757@10.108.160.18"; JSESSIONID=aaaEK20l8ctLw9SDeioDx; ___rl__test__cookies=1611923654835'
            }

            start_sign = "fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@"
            sign_ = hashlib.md5(start_sign.encode()).hexdigest()
            Data = {
                'i' : e ,
                'from' : 'AUTO',
                'to' : 'AUTO',
                'smartresult' : 'dict',
                'client' : 'fanyideskweb',
                'salt' : i,                 #时间戳加(0,9)随机整数
                'sign' : sign_,              # "fanyideskweb" + 输入的内容 + i + "Tbh5E8=q6U3EXe+&L[4c@"  在youdaojs文件中进行md5加密;也可以直接用sign_(直接用hashlib模板的md5加密方法)
                'lts' : r,                  #时间戳
                'bv' : 'c795a332c678d5063a1ee5eb15253848',
                'doctype' : 'json',
                'version' : '2.1',
                'keyfrom' : 'fanyi.web',
                'action' : 'FY_BY_REALTlME'
            }
            try:#对requests异常处理
                # 发送请求,获取响应
                rsp = requests.post(url, headers=Header, data=Data)
                # print(rsp)  #检查接口
            except:
                print('接口错误,请退出程序!!')
            else:
                # 打印数据

                if len(rsp.json())>1:
                    # print(Data['i'])
                    result = rsp.json()
                    # print(result)
                    for items in rsp.json()['translateResult']:
                        for item in items:
                            print("翻译后:",item['tgt'])
                            # print("src长度为:", len(item['src']))
                else:
                    print("输入错误请重新输入!!!")
        else :
            print("输入错误请重新输入!!!")
        del e
'''     
        src为当前语句翻译前的字符串
        tgt为翻译后的内容
        BUG:  
        最多只能翻译src的长度为50个字符的内容
        Bug:           
            1.输入多个英文字符事翻译内容显示不完全,而输入多个中文字符翻译内容正确      
        问题分析:  
            2 导致的原因src字符长度限制问题被网站辨识爬虫 在请求返回时候限制了翻译字数 src
        
        解决方案:
        进aj文件查看src,tgt怎么得出
        将input的英文长度>50就 .分割  依次请求后拼接翻译内容(应该没啥用,只能小规模减小错误)
'''

运行结果:

js解析小技巧搜索可以直接搜索关键字如md5,hash,AES,DES,RSA等加密关键字

大部分网站都运用到时间戳进行加密,看到13位数字的参数值大概率就是时间戳,还有些网站在js加密过程中中进行了as值转换根本搜不到上传的参数,不用慌找加密关键字或者根据调用的函数打断点一个个找如蜂窝网

里面各注释也写的很详细了,还有存在的bug也标明,有道翻译爬取到此结束~


第四步:文件打包

转载python3项目打包成exe可执行程序 - 测试一枝花 - 博客园

打包那一步直接在pycharm的Trminal输入命令:

pyinstaller -F xxx.py(xxx.py,打包的文件名称)

打包成功后到py文件目录里,找到新增的dist文件夹打开就有exe文件了,可以发给其他小伙伴运行

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值