赞
踩
本文只是分享一下python爬虫心得,如果有违规,会删除本文。
打开f12后,随意输入一个需要被翻译的单词,查看请求。本次实验只看中英互译,没有测其它语言。
仔细查看了一下几个请求返回的结果,发现有两个请求是我需要的。一个是识别是中文译英文,还是英文译中文,另一个请求就是直接返回给我翻译后的结果的。
先写第一个请求,确认是中译英,还是英译中。第一个请求没有什么难点,很常规的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
多次输入词汇进行翻译后,比较了这个请求,发现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很像,不出意外就是这个了。
接下来我们就来调用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好像也能获取到我们需要的东西,以后有时间再试下了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。