当前位置: 首页 > 后端技术 > Python

python爬虫简单实现百度翻译

时间:2023-03-26 00:15:32 Python

环境python版本号系统浏览器python3.7.2win7googlechrome关于本文本文将通过爬虫实现简单的百度翻译。本文代码仅供学习,请勿用于商业用途。业务功能请到api.fanyi.baidu.com购买付费API。如有侵权,立即删除文章!实现思路是在网站文件中寻找隐藏的免费API。传入api需要的参数,并对其进行请求。在返回的json结果中找到对应的翻译结果。百度翻译的反爬机制是利用js算法生成的signcookie检测token代码,找到网站文件中隐藏的免费API,进入百度翻译,输入一段需要翻译的文字。翻译结果出来后,按F12,选择NETWORK,最后点击进入XHR文件。此时网站文件已经加载完成,需要F5刷新。刷新后,我们可以找到一个以v2transapi?开头的文件,不错,就是我们要找的api接口。我们来验证一下,点击文件-预览,可以在数据中找到json格式的翻译结果,验证成功。另外,我们还需要获取我们的cookie和token,在后续的反爬虫机制中需要用到,位置如下。cookie位置:token位置:api信息接口:https://fanyi.baidu.com/v2tra...请求方式:post请求参数集合参数介绍从源语言到目标语言查询翻译文本签名js算法生成的签名(反-crawling)tokenrequestcode开始写代码importrequestandexecjs库importrequestsimportexecjsrequestsHTTP库,用于爬虫execjs用于调用js代码反爬由于百度翻译有cookie识别反爬机制,所以我们设置起来,我们刚刚得到它的cookie来掩盖网络蜘蛛的身份。headers={'cookie':'请在此处输入您的cookie'}另外,我们还需要设置token(密码)。token='Pleaseputyourtokenhere'最后只剩下sign反爬机制了,sign是js算法生成的翻译签名。在网上搜索了一下,找到了对应的js算法,分享给大家。vari="320305.131321201"functionn(r,o){for(vart=0;t=“一个”?a.charCodeAt(0)-87:Number(a),a="+"===o.charAt(t+1)?r>>>a:r<30&&(r=""+r.substr(0,10)+r.substr(Math.floor(t/2)-5,10)+r.substr(-10,10))}else{对于(vare=r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/),C=0,h=e.length,f=[];h>C;C++)""!==e[C]&&f.push.apply(f,a(e[C].split(""))),C!==h-1&&f.push(o[C]);varg=f.length;g>30&&(r=f.slice(0,10).join("")+f.slice(Math.floor(g/2)-5,Math.floor(g/2)+5).join("")+f.slice(-10).join(""))}varu=void0,l=""+String.fromCharCode(103)+String.fromCharCode(116)+String.fromCharCode(107);你=空!==我?我:(我=窗口[l]||“”)||"";对于(vard=u.split("."),m=Number(d[0])||0,s=Number(d[1])||0,S=[],c=0,v=0;v一个?S[c++]=A:(2048>A?S[c++]=A>>6|192:(55296===(64512&A)&&v+1>18|240,S[c++]=A>>12&63|128):S[c++]=A>>12|224,S[c++]=A>>6&63|128),S[c++]=63&A|128)}for(varp=m,F=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(97)+(""+String.fromCharCode(94)+String.fromCharCode(43)+String.fromCharCode(54)),D=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(51)+(""+String.fromCharCode(94)+String.fromCharCode(43)+String.fromCharCode(98))+(""+字符串.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(102)),b=0;bp&&(p=(2147483647&p)+2147483648),p%=1e6,p.toString()+"."+(p^m)}等等,我们不是在用python爬行吗?那我们不知道js代码,怎么调用呢?好在python有强大的第三方库。当然调用js代码的库有很多,但是我还是推荐大家使用execjs,简单又完整。在调用js算法代码之前,我们还需要让用户输入一个翻译。在q=input('translation:')之后,我们可以使用execjs的compile和call方法来获取sign。js='''vari="320305.131321201"functionn(r,o){for(vart=0;t=“一个”?a.charCodeAt(0)-87:Number(a),a="+"===o.charAt(t+1)?r>>>a:r<30&&(r=""+r.substr(0,10)+r.substr(Math.floor(t/2)-5,10)+r.substr(-10,10))}else{对于(vare=r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/),C=0,h=e.length,f=[];h>C;C++)""!==e[C]&&f.push.apply(f,a(e[C].split(""))),C!==h-1&&f.push(o[C]);varg=f.length;g>30&&(r=f.slice(0,10).join("")+f.slice(Math.floor(g/2)-5,Math.floor(g/2)+5).join("")+f.slice(-10).join(""))}varu=void0,l=""+String.fromCharCode(103)+String.fromCharCode(116)+String.fromCharCode(107);你=空!==我?我:(我=窗口[l]||“”)||"";对于(vard=u.split("."),m=Number(d[0])||0,s=Number(d[1])||0,S=[],c=0,v=0;v一个?S[c++]=A:(2048>A?S[c++]=A>>6|192:(55296===(64512&A)&&v+1>18|240,S[c++]=A>>12&63|128):S[c++]=A>>12|224,S[c++]=A>>6&63|128),S[c++]=63&A|128)}for(varp=m,F=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(97)+(""+String.fromCharCode(94)+String.fromCharCode(43)+String.fromCharCode(54)),D=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(51)+(""+String.fromCharCode(94)+String.fromCharCode(43)+String.fromCharCode(98))+(""+字符串.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(102)),b=0;bp&&(p=(2147483647&p)+2147483648),p%=1e6,p.toString()+"."+(p^m)}'''sign=execjs.compile(js).call("e",q)(上面代码得到的符号)经过一系列的反爬虫准备,我们就可以设置"sourcelanguage”和“targetlanguage”的最后两个参数是From='en'To='zh'(以上代码代表英文翻译,如果要翻译成其他语言,请输入语言对应的英文缩写,英文缩写对应的表格会放在文末)然后,我们可以构建参数json.data={'from':From,'to':To,'query':q,'sign':sign,'token':'14b5f31e3c65d89a0b1c3f756e53942e'}最后,我们可以请求数据并打印它text=requests.post(url,headers=headers,data=data).json()print(text)我们发现,打印出来的结果是一个json字典,里面有翻译结果,我们只需要翻译结果,就可以索引翻译结果的位置,然后打印出来。text=requests.post(url,headers=headers,data=data).json()['trans_result']['data'][0]['dst']print(text)运行结果:完整代码:importrequestimportexecjsurl='https://fanyi.baidu.com/v2transapi'headers={'cookie':'你的cookie'}js='''vari="320305.131321201"functionn(r,o){for(vart=0;t=“一个”?a.charCodeAt(0)-87:Number(a),a="+"===o.charAt(t+1)?r>>>a:r<30&&(r=""+r.substr(0,10)+r.substr(Math.floor(t/2)-5,10)+r.substr(-10,10))}else{对于(vare=r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/),C=0,h=e.length,f=[];h>C;C++)""!==e[C]&&f.push.apply(f,a(e[C].split(""))),C!==h-1&&f.push(o[C]);varg=f.length;g>30&&(r=f.slice(0,10).join("")+f.slice(Math.floor(g/2)-5,Math.floor(g/2)+5).join("")+f.slice(-10).join(""))}varu=void0,l=""+String.fromCharCode(103)+String.fromCharCode(116)+String.fromCharCode(107);你=空!==我?我:(我=窗口[l]||“”)||"";对于(vard=u.split("."),m=Number(d[0])||0,s=Number(d[1])||0,S=[],c=0,v=0;v一个?S[c++]=A:(2048>A?S[c++]=A>>6|192:(55296===(64512&A)&&v+1>18|240,S[c++]=A>>12&63|128):S[c++]=A>>12|224,S[c++]=A>>6&63|128),S[c++]=63&一个|128)}for(varp=m,F=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(97)+(""+String.fromCharCode(94)+String.fromCharCode(43))+String.fromCharCode(54)),D=""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(51)+(""+String.fromCharCode(94)+String.fromCharCode(43)+String.fromCharCode(98))+(""+String.fromCharCode(43)+String.fromCharCode(45)+String.fromCharCode(102)),b=0;bp&&(p=(2147483647&p)+2147483648),p%=1e6,p.toString()+"."+(p^m)}'''From='sourcelanguage'To='targetlanguage'token='yourtoken'q=input('translation:')sign=execjs.compile(js).call("e",q)data={'from':From,'to':To,'query':q,'sign':sign,'token':token}text=requests.post(url,headers=headers,data=data).json()['trans_result']['data'][0]['dst']print(text)语言和英文缩写对应表{'zh':'中文','jp':'日文','jpka':'日语假名','th':'泰语','fra':'法语','en':'英语','spa':'西班牙语','kor':'韩语','tr':'土耳其语','vie':'越南语','ms':'马来语','from':'德语','ru':'俄罗斯语','ir':'伊朗语','weather':'阿拉伯语','est':'爱沙尼亚','be':'白俄罗斯','bul':'保加利亚','hi':'印度','is':'冰岛','pl':'波兰','fa':'Persian','dan':'丹麦语','tl':'菲律宾语','fin':'芬兰语','nl':'荷兰语','ca':'加泰罗尼亚语','cs':'捷克语','hr':'克罗地亚语','lv':'拉脱维亚语','lt':'立陶宛语','rom':'罗马尼亚语','af':'南非荷兰语','no':'挪威语','pt_BR':'巴西','pt':'葡萄牙','swe':'瑞典','sr':'塞尔维亚','eo':'世界语','sk':'斯洛伐克','slo':'斯洛文尼亚语','sw':'SwaHeli','uk':'乌克兰语','iw':'希伯来语','el':'希腊语','hu':'匈牙利语','hy':'Armenian','it':'Italian','id':'Indonesian','sq':'Albanian','am':'Amharic','as':'Assamese','az':'阿塞拜疆语','eu':'巴斯克语','bn':'孟加拉语','bs':'波斯尼亚语','gl':'加利西亚语','ka':'格鲁吉亚语','gu':'古吉拉特语','ha':'豪萨语','ig':'伊博语','iu':'因纽特人'','ga':'爱尔兰语','zu':'祖鲁语','kn':'Kanada','kk':'哈萨克语','ky':'吉尔吉斯语','lb':'卢森堡语','mk':'马其顿语','mt':'马耳他语','mi':'毛利语','mr':'Marathi','ne':'Nepali','or':'Odia','pa':'Punjabi','qu':'Kechua','tn':'Setswana','si':'僧伽罗语','ta':'泰米尔语','tt':'鞑靼语','te':'泰卢固语','ur':'乌尔都语','uz':'乌兹别克语','cy':'威尔士语','yo':'约鲁巴语','yue':'粤语','wyw':'文言文','cht':'繁体中文'}