某翻译爬虫脚本

请求分析

第一步,打开开发者工具;第二步在翻译窗口输入待翻译的内容;第三步查看请求

输入内容找到请求

首先在框内随便输入内容
在这里插入图片描述
然后查看筛选请求 找到我们需要的接口

在这里插入图片描述
在这里插入图片描述

查看请求参数

在这里插入图片描述

参数分析

“i”: 需要的翻译的内容,
“from”: “AUTO”, 输入的是什么语言 这里默认AUTO就好
“to”: “AUTO”, 需要翻译成什么内容 这么选择默认 也可以去页面上点击翻译为其他语言查看这个的内容,填写对应的value就好
“smartresult”: “dict”, 固定的不需要管
“client”: “fanyideskweb”, 固定的不需要管
“salt”: 需要处理的参数
“sign”: 需要处理的参数
“lts”: 需要处理的参数
“bv”: 需要处理的参数
“doctype”: “json”, 选择默认的
“version”: “2.1”, 选择默认的
“keyfrom”: “fanyi.web”, 选择默认的
“action”: “FY_BY_REALTlME” 选择默认的

经过分析 变化的只有五个参数 :
i:需要翻译的内容
salt: 需要处理的参数
sign: 需要处理的参数
lts: 需要处理的参数
bv: 需要处理的参数

参数破解

该过程只供学习参考 禁止商用

进入到上面分析的请求所加载的JS函数 (我瞅着这个单词 有点像我需要的 我就直接从这里进去了)
在这里插入图片描述
进去后直接下个断 尊重一下 试一下能不能断住 最后发现能断住 接着搜索下我们需要的参数 看看在不在这个文件当中 如果在的话直接就秒了 如果不在的话就再跟一下 (也可以直接去调用栈跟一下 怎么顺手怎么弄)
在这里插入图片描述

最后发现了加密的位置:

在这里插入图片描述
直接一网打尽 简单分析一下 :
ts:是一个时间戳
bv:t 而t是navigator.appVersion的MD5加密 navigator.appVersion是浏览器的指纹
在这里插入图片描述
salt:是ts 在末尾随机加了一个1-10的随机数
sign: 固定字符串+e+salt+固定字符串 然后MD5加密了一下 直接调试 看一下e是什么东西
在这里插入图片描述
可以发现 这个e就是我们的搜索关键字 到此 加密全部破解完成
之后用它自己生成的时间戳验证了一下 参数能对应上 证明参数破解完成 接下来直接开始写代码

代码编写

加密参数

def get_jiami(keyword, UA):
    bv = get_md5(UA.replace('Mozilla/', ''))
    # bv = hashlib.md5(
    #     '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode(
    #         "utf-8")).hexdigest()
    ts = int(time.time() * 1000)
    salt = str(ts) + str(random.randint(1, 10))
    sign = get_md5("fanyideskweb" + keyword + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5")
    return bv, ts, salt, sign

def get_md5(the_str):
    md5 = hashlib.md5()
    md5.update(the_str.encode('utf8'))
    psw = md5.hexdigest()
    return psw

最后在封装写一下请求逻辑 测试一下 (cookie 需要带上 不然请求不成功)
在这里插入图片描述

完整代码

import hashlib, time, random, requests

def get_md5(the_str):
    md5 = hashlib.md5()
    md5.update(the_str.encode('utf8'))
    psw = md5.hexdigest()
    return psw


def get_jiami(keyword, UA):
    bv = get_md5(UA.replace('Mozilla/', ''))
    # bv = hashlib.md5(
    #     '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'.encode(
    #         "utf-8")).hexdigest()
    ts = int(time.time() * 1000)
    salt = str(ts) + str(random.randint(1, 10))
    sign = get_md5("fanyideskweb" + keyword + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5")
    return bv, ts, salt, sign


'''
ts:时间戳
salt:ts+1-10的随机数
bv: UA  md5加密
sign: "fanyideskweb" + 关键字 + salt + "Ygy_4c=r#e#4EX^NUGUc5"
'''


def main(keyword):
    url = 'https://fanyi.youdao.com/translate_o'
    UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
    headers = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Content-Length": "{}".format(len(keyword)),
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": "OUTFOX_SEARCH_USER_ID=-1182719475@10.110.96.157; OUTFOX_SEARCH_USER_ID_NCOO=235541301.15775356; fanyi-ad-id=305838; fanyi-ad-closed=1; JSESSIONID=aaaZWknU5_J8Jc4lEQCcy; ___rl__test__cookies=1651903263971",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": UA,
        "X-Requested-With": "XMLHttpRequest"
    }
    bv, ts, salt, sign = get_jiami(keyword=keyword, UA=UA)
    data = {
        "i": keyword,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": salt,
        "sign": sign,
        "lts": ts,
        "bv": bv,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME"
    }
    response = requests.post(url=url, headers=headers, data=data,)
    response.encoding = 'utf8'
    response = response.json()
    code = response.get('errorCode')
    if code == 0:
        print(response)

    else:
        print(response)
if __name__ == '__main__':
    keyword = '你好啊'
    main(keyword)

其他问题

我写完之后 尝试了一下这个接口 有两个问题1、响应速度很慢 2、调用到一定的时间之后 会不返回响应(IP被封掉了,换了代理之后能继续使用) 但是我的访问速度非常的慢 单线程访问一次还随机睡眠了一到三秒 不知道是不是在检查cookie或者其他的东西 有没有大佬解惑一下
最后:该文章只供学习参考 禁止商用如需转载请注明原创

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值