利用python調(diào)用谷歌翻譯API

廢話少說(shuō)

從速賣(mài)通抓取了一些評(píng)論想進(jìn)行一些簡(jiǎn)單的文本分析,但是因?yàn)樗儋u(mài)通是一個(gè)跨境電商平臺(tái)诉濒,上邊的評(píng)論基本都是小語(yǔ)種,對(duì)夕春,小語(yǔ)種未荒,俄語(yǔ),法語(yǔ)...英語(yǔ)還可以勉強(qiáng)應(yīng)付一下及志,但是其他真的是一個(gè)字母都不認(rèn)識(shí)啊片排,所以我就想能不能用python解決這個(gè)問(wèn)題。
知名的翻譯(我聽(tīng)說(shuō)的)就是谷歌速侈,百度率寡,有道,有道翻譯英語(yǔ)還行倚搬,小語(yǔ)種效果太差了冶共,直接放棄,經(jīng)過(guò)對(duì)比百度和谷歌,準(zhǔn)確率上還是谷歌更準(zhǔn)確一點(diǎn)捅僵,畢竟谷歌搜索是全世界的人為其提供訓(xùn)練語(yǔ)料家卖,而百度基本只有中國(guó)人在用。
但是,良心百度提供了翻譯API接口,而谷歌沒(méi)有,哎沒(méi)辦法爬骤,只能爬了...

正文

首先用chrome打開(kāi)谷歌搜翻譯,看看它是怎么請(qǐng)求數(shù)據(jù)的
右鍵 檢查 進(jìn)入開(kāi)發(fā)者工具
選擇network,如圖

image.png

先點(diǎn)擊一下這個(gè)clear,把原來(lái)的請(qǐng)求都clear(當(dāng)然是視覺(jué)上clear)
image.png

輸入測(cè)試翻譯內(nèi)容
image.png

我們很快得到了翻譯結(jié)果榛臼,同時(shí)得到了下面幾個(gè)新的請(qǐng)求,那么返回的結(jié)果肯定在下面這幾個(gè)請(qǐng)求窜司,因?yàn)橹耙呀?jīng)clear掉了沛善,所以新的請(qǐng)求并不多(測(cè)試前,先clear,這個(gè)技巧很重要塞祈,特別是對(duì)于那種電商網(wǎng)站金刁,請(qǐng)求分分鐘幾十上百,你不先clear掉的話议薪,要找到猴年馬月
我們很快就可以發(fā)現(xiàn)是下面這個(gè)請(qǐng)求返回了翻譯結(jié)果
image.png

image.png

通過(guò)請(qǐng)求頭信息尤蛮,可以發(fā)現(xiàn)是get請(qǐng)求,請(qǐng)求翻譯的內(nèi)容是通過(guò)q這個(gè)參數(shù)傳遞的斯议,其它參數(shù)暫時(shí)不知道什么意思产捞。然后,我們就可以用requests庫(kù)模仿這個(gè)請(qǐng)求哼御,看看能否成功坯临。

import requests
res=requests.get('https://translate.google.cn/translate_a/single?client=t&sl=auto&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&tk=272537.149261&q=oh%20shit')
print(res.text)
image.png

直接成功,谷歌翻譯這么好爬的嘛恋昼?感覺(jué)不靠譜看靠,把q后面的內(nèi)容換成hello,果然不行了,報(bào)了403液肌,服務(wù)器禁止了挟炬。哎,我還是太naive啊


image.png

那么嗦哆,肯定請(qǐng)求參數(shù)里還有一些參數(shù)是實(shí)時(shí)根據(jù)內(nèi)容變化的谤祖,很容易注意的tk這個(gè)參數(shù)。tk=272537.149261吝秕,一串?dāng)?shù)字泊脐,你在谷歌翻譯里換其它字符串測(cè)試,就會(huì)發(fā)現(xiàn)其它參數(shù)基本都一樣烁峭,只有這個(gè)tk不一樣.但是呢?以我目前這個(gè)水平,是沒(méi)有能力破解的约郁,于是百度之缩挑。果然有大神已經(jīng)破解了這個(gè)tk,但是因?yàn)閠k的生成是js生成的鬓梅,所以很多人直接選擇了node.js來(lái)實(shí)現(xiàn)這個(gè)爬蟲(chóng)供置,但是我已經(jīng)習(xí)慣了強(qiáng)大方便的python requests庫(kù),所以還是選擇繼續(xù)用python,找了很久才找到python 版本绽快,現(xiàn)在分享出來(lái)芥丧。

import requests
import json
from bs4 import BeautifulSoup
import execjs #必須,需要先用pip 安裝坊罢,用來(lái)執(zhí)行js腳本
class Py4Js():     
  def __init__(self):  
    self.ctx = execjs.compile(""" 
    function TL(a) { 
    var k = ""; 
    var b = 406644; 
    var b1 = 3293161072;       
    var jd = "."; 
    var $b = "+-a^+6"; 
    var Zb = "+-3^+b+-f";    
    for (var e = [], f = 0, g = 0; g < a.length; g++) { 
        var m = a.charCodeAt(g); 
        128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), 
        e[f++] = m >> 18 | 240, 
        e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, 
        e[f++] = m >> 6 & 63 | 128), 
        e[f++] = m & 63 | 128) 
    } 
    a = b; 
    for (f = 0; f < e.length; f++) a += e[f], 
    a = RL(a, $b); 
    a = RL(a, Zb); 
    a ^= b1 || 0; 
    0 > a && (a = (a & 2147483647) + 2147483648); 
    a %= 1E6; 
    return a.toString() + jd + (a ^ b) 
  };      
  function RL(a, b) { 
    var t = "a"; 
    var Yb = "+"; 
    for (var c = 0; c < b.length - 2; c += 3) { 
        var d = b.charAt(c + 2), 
        d = d >= t ? d.charCodeAt(0) - 87 : Number(d), 
        d = b.charAt(c + 1) == Yb ? a >>> d: a << d; 
        a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d 
    } 
    return a 
  } 
 """)            
  def getTk(self,text):  
      return self.ctx.call("TL",text)
def buildUrl(text,tk):
  baseUrl='https://translate.google.cn/translate_a/single'
  baseUrl+='?client=t&'
  baseUrl+='s1=auto&'
  baseUrl+='t1=zh-CN&'
  baseUrl+='h1=zh-CN&'
  baseUrl+='dt=at&'
  baseUrl+='dt=bd&'
  baseUrl+='dt=ex&'
  baseUrl+='dt=ld&'
  baseUrl+='dt=md&'
  baseUrl+='dt=qca&'
  baseUrl+='dt=rw&'
  baseUrl+='dt=rm&'
  baseUrl+='dt=ss&'
  baseUrl+='dt=t&'
  baseUrl+='ie=UTF-8&'
  baseUrl+='oe=UTF-8&'
  baseUrl+='otf=1&'
  baseUrl+='pc=1&'
  baseUrl+='ssel=0&'
  baseUrl+='tsel=0&'
  baseUrl+='kc=2&'
  baseUrl+='tk='+str(tk)+'&'
  baseUrl+='q='+text
  return baseUrl
def translate(text):
  header={
    'authority':'translate.google.cn',
    'method':'GET',
    'path':'',
    'scheme':'https',
    'accept':'*/*',
    'accept-encoding':'gzip, deflate, br',
    'accept-language':'zh-CN,zh;q=0.9',
    'cookie':'',
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
'x-client-data':'CIa2yQEIpbbJAQjBtskBCPqcygEIqZ3KAQioo8oBGJGjygE='
  }
  url=buildUrl(text,js.getTk(text))
  res=''
  try:
      r=requests.get(url)
      result=json.loads(r.text)
      if result[7]!=None:
      # 如果我們文本輸錯(cuò)续担,提示你是不是要找xxx的話,那么重新把xxx正確的翻譯之后返回
          try:
              correctText=result[7][0].replace('<b><i>',' ').replace('</i></b>','')
              print(correctText)
              correctUrl=buildUrl(correctText,js.getTk(correctText))
              correctR=requests.get(correctUrl)
              newResult=json.loads(correctR.text)
              res=newResult[0][0][0]
        except Exception as e:
              print(e)
              res=result[0][0][0]
    else:
          res=result[0][0][0]
  except Exception as e:
      res=''
      print(url)
      print("翻譯"+text+"失敗")
      print("錯(cuò)誤信息:")
      print(e)
  finally:
      return res
if __name__ == '__main__':
  js=Py4Js()
  res=translate('Всё качественно и быстро!')
  print(res)

最后

谷歌返回的結(jié)果是一個(gè)json格式的數(shù)據(jù)活孩,我們將其變成一個(gè)嵌套的list物遇,可以發(fā)現(xiàn)該list長(zhǎng)度為9,第零個(gè)元素就是翻譯結(jié)果,第七個(gè)結(jié)果是一些提示信息憾儒。如圖


image.png

當(dāng)有提示信息的時(shí)候询兴,我們將正確的信息重新翻譯一遍,返回起趾。
其次翻譯之前一定要先分句诗舰,因?yàn)槲覝y(cè)試這樣準(zhǔn)確率更高一點(diǎn),直接一段翻譯有時(shí)候會(huì)面貌全非训裆,但是分開(kāi)一句句翻譯始衅,基本就是人話了。
我目前連續(xù)測(cè)試上千條語(yǔ)句還沒(méi)有問(wèn)題缭保,但是速度有快有慢汛闸,而且有時(shí)候,如果數(shù)據(jù)量太大的話艺骂,可以采用每翻譯一句sleep(1),或者使用代理IP

聲明

那段破解的腳本是直接從別人博客復(fù)制過(guò)來(lái)的诸老,但是忘了鏈接了,抱歉!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钳恕,一起剝皮案震驚了整個(gè)濱河市别伏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忧额,老刑警劉巖厘肮,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異睦番,居然都是意外死亡类茂,警方通過(guò)查閱死者的電腦和手機(jī)耍属,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巩检,“玉大人厚骗,你說(shuō)我怎么就攤上這事【た蓿” “怎么了领舰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)迟螺。 經(jīng)常有香客問(wèn)我冲秽,道長(zhǎng),這世上最難降的妖魔是什么矩父? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任锉桑,我火速辦了婚禮,結(jié)果婚禮上浙垫,老公的妹妹穿的比我還像新娘刨仑。我一直安慰自己,他們只是感情好夹姥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布杉武。 她就那樣靜靜地躺著,像睡著了一般辙售。 火紅的嫁衣襯著肌膚如雪轻抱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天旦部,我揣著相機(jī)與錄音祈搜,去河邊找鬼。 笑死士八,一個(gè)胖子當(dāng)著我的面吹牛容燕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婚度,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蘸秘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蝗茁?” 一聲冷哼從身側(cè)響起醋虏,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哮翘,沒(méi)想到半個(gè)月后颈嚼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饭寺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年阻课,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叫挟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柑肴,死狀恐怖霞揉,靈堂內(nèi)的尸體忽然破棺而出旬薯,到底是詐尸還是另有隱情晰骑,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布绊序,位于F島的核電站硕舆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏骤公。R本人自食惡果不足惜抚官,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阶捆。 院中可真熱鬧凌节,春花似錦、人聲如沸洒试。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垒棋。三九已至卒煞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叼架,已是汗流浹背畔裕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖订,地道東北人扮饶。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乍构,于是被迫代替她去往敵國(guó)和親甜无。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,841評(píng)論 25 707
  • 數(shù)據(jù)結(jié)構(gòu)整理篇蜡吧。 概念: 排序:按照一定的關(guān)鍵字毫蚓,將一個(gè)序列排列成想要得到的一個(gè)新的序列 排序分類: (1)交換類...
    小學(xué)生的博客閱讀 256評(píng)論 0 0
  • 早上收到學(xué)校入職電話及郵件通知元潘,呼呼,星期一就要交體檢報(bào)告君仆,問(wèn)了幾家醫(yī)院翩概,幸好婦幼星期六可以體檢牲距。慶幸前段時(shí)間投簡(jiǎn)...
    天牛成長(zhǎng)記閱讀 185評(píng)論 0 0
  • 前任评姨,有人說(shuō)最好的狀態(tài)就是不聯(lián)系难述,見(jiàn)面一笑而過(guò),尊重彼此最后的溫柔吐句。 1. 分開(kāi)久了胁后,當(dāng)初再熟悉親密的人,都會(huì)慢慢...
    時(shí)光涼的小貝閱讀 532評(píng)論 1 4