溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用python如何實現(xiàn)一個百度翻譯功能

發(fā)布時間:2020-11-17 14:43:20 來源:億速云 閱讀:171 作者:Leah 欄目:開發(fā)技術(shù)

利用python如何實現(xiàn)一個百度翻譯功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

實現(xiàn)思路

在網(wǎng)站文件中找到隱藏的免費api。傳入api所需要的參數(shù)并對其發(fā)出請求。在返回的json結(jié)果里找到相應(yīng)的翻譯結(jié)果。

百度翻譯的反爬機制

  • 由js算法生成的sign
  • cookie檢測
  • token暗號

在網(wǎng)站文件中找到隱藏的免費api

進(jìn)入百度翻譯,隨便輸入一段需要翻譯的文字。當(dāng)翻譯結(jié)果出來的時候,按下F12,選擇到NETWORK,最后點進(jìn)XHR文件。這個時候,網(wǎng)站文件都已經(jīng)加載完了,所以要F5刷新一下。

利用python如何實現(xiàn)一個百度翻譯功能

刷新了之后,我們就能發(fā)現(xiàn)一個以v2transapi?開頭的文件,沒錯,它就是我們要找的api接口。讓我們驗證一下,點進(jìn)去文件-preview,我們就可以在json格式的數(shù)據(jù)里面找到翻譯結(jié)果,驗證成功。
另外,我們還需要獲取我們的cookie和token,在之后的反爬機制中我們需要用到它們,位置如以下。
cookie位置:

利用python如何實現(xiàn)一個百度翻譯功能

token位置:

利用python如何實現(xiàn)一個百度翻譯功能

api信息

接口:https://fanyi.baidu.com/v2tra...
請求方式:post

請求參數(shù)大全

參數(shù)介紹
from源語言
to目標(biāo)語言
query翻譯文本
sign由js算法生成的簽名(反爬)
token請求暗號

開始寫代碼

導(dǎo)入request和execjs庫

import requests
import execjs
  • requests HTTP庫,用于爬蟲
  • execjs 用于調(diào)用js代碼
     

反反爬蟲

由于百度翻譯有cookie識別反爬機制,所以我們設(shè)置好我們剛剛獲取到的cookie來進(jìn)行掩護(hù)網(wǎng)絡(luò)蜘蛛身份。

headers = {'cookie':'請在這里輸入你的cookie'}

另外,我們還要設(shè)置好token(暗號)。

token = '請在這里放置你的token'

最后只剩下sign反爬機制了,sign是由js算法給譯文生成的一個簽名。我在網(wǎng)上搜了一下,找到了相應(yīng)的js算法,分享給大家。

var i = "320305.131321201"
function n(r, o) {
  for (var t = 0; t < o.length - 2; t += 3) {
    var a = o.charAt(t + 2);
    a = a >= "a" &#63; a.charCodeAt(0) - 87 : Number(a), a = "+" === o.charAt(t + 1) &#63; r >>> a : r << a, r = "+" === o.charAt(t) &#63; r + a & 4294967295 : r ^ a
  }
  return r
}
 
 
function e(r) {
  var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
  if (null === o) {
    var t = r.length;
    t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
  } else {
    for (var e = 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]);
    var g = 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(""))
  }
  var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
  u = null !== i &#63; i : (i = window[l] || "") || "";
  for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
    var A = r.charCodeAt(v);
    128 > A &#63; S[c++] = A : (2048 > A &#63; S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) &#63; (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)), S[c++] = A >> 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 (var p = 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; b < S.length; b++) p += S[b], p = n(p, F);
  return p = n(p, D), p ^= s, 0 > p && (p = (2147483647 & p) + 2147483648), p %= 1e6, p.toString() + "." + (p ^ m)
}

等等,我們不是在用python進(jìn)行爬蟲嗎?那我們又不會js代碼,怎么調(diào)用?。?br/>還好python有著強大的第三方庫,當(dāng)然也少不了調(diào)用js代碼的庫。調(diào)用js代碼的庫很多,但是本人還是推薦大家使用execjs,簡單功能又完整。

在調(diào)用js算法代碼之前,我們還需要讓用戶輸入一段譯文。

q = input('翻譯:')

之后我們就能使用execjs的compile和call方法來獲取sign了。

js = '''var i = "320305.131321201"
function n(r, o) {
  for (var t = 0; t < o.length - 2; t += 3) {
    var a = o.charAt(t + 2);
    a = a >= "a" &#63; a.charCodeAt(0) - 87 : Number(a), a = "+" === o.charAt(t + 1) &#63; r >>> a : r << a, r = "+" === o.charAt(t) &#63; r + a & 4294967295 : r ^ a
  }
  return r
}
 
 
function e(r) {
  var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
  if (null === o) {
    var t = r.length;
    t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
  } else {
    for (var e = 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]);
    var g = 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(""))
  }
  var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
  u = null !== i &#63; i : (i = window[l] || "") || "";
  for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
    var A = r.charCodeAt(v);
    128 > A &#63; S[c++] = A : (2048 > A &#63; S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) &#63; (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)), S[c++] = A >> 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 (var p = 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; b < S.length; b++) p += S[b], p = n(p, F);
  return p = n(p, D), p ^= s, 0 > p && (p = (2147483647 & p) + 2147483648), p %= 1e6, p.toString() + "." + (p ^ m)
}
'''
sign = execjs.compile(js).call("e",q)

(以上代碼獲取了sign)

經(jīng)過一系列的反反爬蟲準(zhǔn)備,我們就可以設(shè)置好的“源語言”和“目標(biāo)語言”最后的這兩個參數(shù)了。

From = 'en'
To = 'zh'

(以上代碼代表著英譯中,若要進(jìn)行其它語言的翻譯,請輸入語言對應(yīng)的英文縮寫,英文縮寫對應(yīng)表將會放到本文最后)
接著,我們就能構(gòu)建參數(shù)json了。

data = {'from':From,
'to':To,
'query':q,
'sign':sign,
'token':'14b5f31e3c65d89a0b1c3f756e53942e'}

最后,我們就能請求數(shù)據(jù)并打印了。

text = requests.post(url,headers=headers,data=data).json()
print(text)

我們發(fā)現(xiàn)打印出來的結(jié)果是個json字典,翻譯結(jié)果就在其中,我們只需要翻譯結(jié)果,所以我們可以索引翻譯結(jié)果的位置再打印。

text = requests.post(url,headers=headers,data=data).json()['trans_result']['data'][0]['dst']
print(text)

運行結(jié)果:

利用python如何實現(xiàn)一個百度翻譯功能

完整代碼:

import requests
import execjs
url = 'https://fanyi.baidu.com/v2transapi'
headers = {'cookie':'你的cookie'}
js = '''var i = "320305.131321201"
function n(r, o) {
  for (var t = 0; t < o.length - 2; t += 3) {
    var a = o.charAt(t + 2);
    a = a >= "a" &#63; a.charCodeAt(0) - 87 : Number(a), a = "+" === o.charAt(t + 1) &#63; r >>> a : r << a, r = "+" === o.charAt(t) &#63; r + a & 4294967295 : r ^ a
  }
  return r
}
 
 
function e(r) {
  var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
  if (null === o) {
    var t = r.length;
    t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
  } else {
    for (var e = 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]);
    var g = 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(""))
  }
  var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
  u = null !== i &#63; i : (i = window[l] || "") || "";
  for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
    var A = r.charCodeAt(v);
    128 > A &#63; S[c++] = A : (2048 > A &#63; S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) &#63; (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)), S[c++] = A >> 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 (var p = 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; b < S.length; b++) p += S[b], p = n(p, F);
  return p = n(p, D), p ^= s, 0 > p && (p = (2147483647 & p) + 2147483648), p %= 1e6, p.toString() + "." + (p ^ m)
}
'''

From = '源語言'
To = '目標(biāo)語言'
token = '你的token'
q = input('翻譯:')
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)

語言英文縮寫對應(yīng)表

{
        'zh': '中文','jp': '日語','jpka': '日語假名','th': '泰語','fra': '法語','en': '英語','spa': '西班牙語','kor': '韓語','tr': '土耳其語','vie': '越南語','ms': '馬來語','de': '德語','ru': '俄語','ir': '伊朗語','ara': '阿拉伯語','est': '愛沙尼亞語','be': '白俄羅斯語','bul': '保加利亞語','hi': '印地語','is': '冰島語','pl': '波蘭語','fa': '波斯語','dan': '丹麥語','tl': '菲律賓語','fin': '芬蘭語','nl': '荷蘭語','ca': '加泰羅尼亞語','cs': '捷克語','hr': '克羅地亞語','lv': '拉脫維亞語','lt': '立陶宛語','rom': '羅馬尼亞語','af': '南非語','no': '挪威語','pt_BR': '巴西語','pt': '葡萄牙語','swe': '瑞典語','sr': '塞爾維亞語','eo': '世界語','sk': '斯洛伐克語','slo': '斯洛文尼亞語','sw': '斯瓦希里語','uk': '烏克蘭語','iw': '希伯來語','el': '希臘語','hu': '匈牙利語','hy': '亞美尼亞語','it': '意大利語','id': '印尼語','sq': '阿爾巴尼亞語','am': '阿姆哈拉語','as': '阿薩姆語','az': '阿塞拜疆語','eu': '巴斯克語','bn': '孟加拉語','bs': '波斯尼亞語','gl': '加利西亞語','ka': '格魯吉亞語','gu': '古吉拉特語','ha': '豪薩語','ig': '伊博語','iu': '因紐特語','ga': '愛爾蘭語','zu': '祖魯語','kn': '卡納達(dá)語','kk': '哈薩克語','ky': '吉爾吉斯語','lb': '盧森堡語','mk': '馬其頓語','mt': '馬耳他語','mi': '毛利語','mr': '馬拉提語','ne': '尼泊爾語','or': '奧利亞語','pa': '旁遮普語','qu': '凱楚亞語','tn': '塞茨瓦納語','si': '僧加羅語','ta': '泰米爾語','tt': '塔塔爾語','te': '泰盧固語','ur': '烏爾都語','uz': '烏茲別克語','cy': '威爾士語','yo': '約魯巴語','yue': '粵語','wyw': '文言文','cht': '中文繁體'  }

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI