python爬取百度翻译反爬解密

本文只是分享一下python爬虫心得,如果有违规,会删除本文。

一、网页分析

打开f12后,随意输入一个需要被翻译的单词,查看请求。本次实验只看中英互译,没有测其它语言。
仔细查看了一下几个请求返回的结果,发现有两个请求是我需要的。一个是识别是中文译英文,还是英文译中文,另一个请求就是直接返回给我翻译后的结果的。
在这里插入图片描述
在这里插入图片描述

二、代码实现

2.1中英互译识别

先写第一个请求,确认是中译英,还是英译中。第一个请求没有什么难点,很常规的post请求,按照流程写个headers和data就可以了。

word = input('please input a word')
# 获取是中-英,还是英-中
def langdetect():
    url = 'https://fanyi.baidu.com/langdetect'
    data = {
        'query': word
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
    }
    res = requests.post(url=url, headers=headers, data=data).json()
    lan = res['lan']
    return lan

2.2 sign解密

多次输入词汇进行翻译后,比较了这个请求,发现sign这个值是难点,需要解密,其它的都没什么难点。
在这里插入图片描述
既然sign的值不知道怎么出来的,那就搜索一下sign。经过一圈查找,定位到我们要的sign在哪个js中。
在这里插入图片描述
在这个js中,前面找到了一个sign打了断点后,进行翻译发现不是,于是接着往后找,找到了需要的sign
在这里插入图片描述
可以看到sign是通过b(e)这个函数得到的,鼠标放在这个函数上,跳到这个函数所在的位置
在这里插入图片描述
好了,我们直接把这段js代码扣下来吧。如果看不清到哪里结束,就把左边的那个向下的小箭头点一下,把这段代码收缩为一行就可以了,直接把这一行拿出来。
在这里插入图片描述
在这里插入图片描述
把js代码取出来后,进行一下小调整
在这里插入图片描述
在这里插入图片描述
运行这个js后,发现有报错,我们去原js中去找找这个r看看是个什么东西。
在这里插入图片描述
找到r所在的这一行,我们再打个断点试试。
在这里插入图片描述
通过多次翻译尝试,发现这个r是个固定值。
在这里插入图片描述
既然r是个固定值,那就好办了,我们直接简单粗暴的申明一个变量赋这个值吧。再次运行代码,r不报错了,又报了一个新的错误。
在这里插入图片描述
好吧,再定位到n,看看n这个函数是怎么回事。
在这里插入图片描述
既然缺少n,那我们就直接把n找到了复制到我们的js代码中吧。
在这里插入图片描述
把这段js拿过来后,我们再次执行我们的代码,运行后的结果跟我们的sign很像,不出意外就是这个了。
在这里插入图片描述

2.3 获取翻译结果

接下来我们就来调用js,写Python代码吧。构造一下请求头和请求体,请求头里面要加一个Cookie,这个Cookie值试了几次是固定的,所以就直接复制下来吧。请求体里面的token也是固定的,就不管它是怎么生成的了,直接拿过来用。完整代码如下:

import time
import requests
import execjs

word = input('please input a word')


# 获取是中-英,还是英-中
def langdetect():
    url = 'https://fanyi.baidu.com/langdetect'
    data = {
        'query': word
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
    }
    res = requests.post(url=url, headers=headers, data=data).json()
    lan = res['lan']
    return lan


if __name__ == '__main__':
    # 获取翻译请求的完整url
    lan = langdetect()
    From = ''
    to = ''
    if lan == 'zh':
        From = 'zh'
        to = 'en'
    if lan == 'en':
        From = 'en'
        to = 'zh'
    translate_url = 'https://fanyi.baidu.com/v2transapi?from=' + From + '&to=' + to

    # 百度翻译,构造请求头和请求data
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'Cookie': 'BIDUPSID=8AEDA9AFB307D71726063895FA7E4381; PSTM=1701092016; BAIDUID=25DD368F33FB20DA7B96D4049B613EB2:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; H_WISE_SIDS=39712_39780_39790_39704_39685_39679_39842_39898_39904_39819_39909; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1701175438,1701348890,1702542539; H_PS_PSSID=39712_39780_39790_39679_39842_39904_39819_39909_39935_39936_39938_39931_39963_39996; delPer=0; BAIDUID_BFESS=25DD368F33FB20DA7B96D4049B613EB2:FG=1; BA_HECTOR=ala024al218ga0050l8h0gai1inlrag1q; ZFY=2qwy7JNUFgabNiq87qSh1H06EVJ88cW5eGVHWM0CsoQ:C; PSINO=3; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BCLID=11280218554129653619; BCLID_BFESS=11280218554129653619; BDSFRCVID=jEIOJexroG3O1HvqfwZI2iaM4_weG7bTDYrEOwXPsp3LGJLVFdWiEG0Pts1-dEu-S2OOogKKKeOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; BDSFRCVID_BFESS=jEIOJexroG3O1HvqfwZI2iaM4_weG7bTDYrEOwXPsp3LGJLVFdWiEG0Pts1-dEu-S2OOogKKKeOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tRAOoC_-tDvDqTrP-trf5DCShUFs0ljiB2Q-XPoO3KOchqnCKtDBMl3XMfQutpRf5mkf3fbgy4op8P3y0bb2DUA1y4vp0t3U2mTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-Q9Qg-qahQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0hD89DjKKD6PVKgTa54cbb4o2WbCQyPQd8pcN2b5oQTtgDt7qb4K8WgLHBRjzJU7beq06-lOUWJDkXpJvQnJjt2JxaqRC3JbRjq5jDh3MKToDb-oteltHB2Oy0hvcWb5cShPCyUjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQhDH-OJ6DHtJ3aQ5rtKRTffjrnhPF3j-_PXP6-hnjy3b79olnK-RQbq6C4MtQYjh4Wbttf5q3Ry6r42-39LPO2hpRjyxv4Q40iMtoxJpOJ-bCL0p5aHx8K8p7vbURvyPLg3-AqBM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIEoC8ytC_KhCvPKITD-tFO5eT22-us0HvR2hcHMPoosIOODf7-KtKWMqAHa4ouJNOf0l05KfbUotoHXnJi0btQDPvxBf7p3DnUBl5TtUJMqIDzbMohqqJXXPnyKMniWKT9-pPKWhQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDj-WDjjXDGRabK6aKC5bL6rJabC3jl5VXU6q2bDeQNb9Jxvq-CcfhqI-2RjYMM76bftb-l0vWq54WbbvLT7johRTWqR4sRb5MfonDh83KNLLKUQtHGAH2h7O5hvvOn5O3MA-yUKmDloOW-TB5bbPLUQF5l8-sq0x0bOte-bQXH_E5bj2qRCDoC8X3q; H_BDCLCKID_SF_BFESS=tRAOoC_-tDvDqTrP-trf5DCShUFs0ljiB2Q-XPoO3KOchqnCKtDBMl3XMfQutpRf5mkf3fbgy4op8P3y0bb2DUA1y4vp0t3U2mTxoUJ2-KDVeh5Gqq-KXU4ebPRiB-Q9Qg-qahQ7tt5W8ncFbT7l5hKpbt-q0x-jLTnhVn0MBCK0hD89DjKKD6PVKgTa54cbb4o2WbCQyPQd8pcN2b5oQTtgDt7qb4K8WgLHBRjzJU7beq06-lOUWJDkXpJvQnJjt2JxaqRC3JbRjq5jDh3MKToDb-oteltHB2Oy0hvcWb5cShPCyUjrDRLbXU6BK5vPbNcZ0l8K3l02V-bIe-t2XjQhDH-OJ6DHtJ3aQ5rtKRTffjrnhPF3j-_PXP6-hnjy3b79olnK-RQbq6C4MtQYjh4Wbttf5q3Ry6r42-39LPO2hpRjyxv4Q40iMtoxJpOJ-bCL0p5aHx8K8p7vbURvyPLg3-AqBM5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIEoC8ytC_KhCvPKITD-tFO5eT22-us0HvR2hcHMPoosIOODf7-KtKWMqAHa4ouJNOf0l05KfbUotoHXnJi0btQDPvxBf7p3DnUBl5TtUJMqIDzbMohqqJXXPnyKMniWKT9-pPKWhQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKuDj-WDjjXDGRabK6aKC5bL6rJabC3jl5VXU6q2bDeQNb9Jxvq-CcfhqI-2RjYMM76bftb-l0vWq54WbbvLT7johRTWqR4sRb5MfonDh83KNLLKUQtHGAH2h7O5hvvOn5O3MA-yUKmDloOW-TB5bbPLUQF5l8-sq0x0bOte-bQXH_E5bj2qRCDoC8X3q; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1702556377'
    }
    # 获取sign
    with open('bd.js', 'r', encoding='utf-8') as f:
        js_code = f.read()
    js_data = execjs.compile(js_code)
    sign = js_data.call('f', word)
    ts = int(time.time() * 1000)
    data = {
        'from': From,
        'to': to,
        'query': word,
        'transtype': 'realtime',
        'simple_means_flag': 3,
        'sign': sign,
        'token': '261bd5475a014457fb0f3df0969dafc2',
        'domain': 'common',
        'ts': ts
    }
    res = requests.post(url=translate_url, headers=headers, data=data).json()
    dst = res['trans_result']['data'][0]['dst']
    print(res)
    print('翻译后的结果是:'+dst)

运行后结果
在这里插入图片描述
这个代码临时性写的测试玩的,有些不规范的地方。后面点了一下发现后面还有一个sign好像也能获取到我们需要的东西,以后有时间再试下了。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值