## python之批量翻譯
#### 一、有道翻譯接口
**以該demo為例,調用接口用不用加密、headers傳不傳都可以,等訪問次數達到一定量就不行了了(目前我試過的都是,更換ip訪問也是不行),如果數據量不大,可以用此方法**
```python
from openpyxl import load_workbook
import requests
import hashlib
import time
import urllib.parse
#創建md5對象
def nmd5(str):
m = hashlib.md5()
# Tips
# 此處必須encode
# 若寫法為m.update(str) 報錯為: Unicode-objects must be encoded before hashing
# 因為python3里默認的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode為bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()
return str_md5
def formdata(transtr):
# 待加密信息
headerstr = '5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
#print(round(time.time()*1000))
bv=nmd5(headerstr)
ts=str(round(time.time()*1000))
salt=ts+'90'
strexample='fanyideskweb'+transtr+salt+'n%A-rKaT5fb[Gy?;N5@Tj'
sign=nmd5(strexample)
#print(sign)
i=len(transtr)
#print(i)
# print('MD5加密前為 :' + headerstr)
# print('MD5加密后為 :' + bv)
dict={'i':transtr,'from':'AUTO','TO':'AUTO','smartresult': 'dict',
'client':'fanyideskweb',
'salt':salt,
'sign':sign,
'ts':ts,
'bv':bv,
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_REALTlME'
}
return dict
workbook = load_workbook(r'xxxxx')
sheet = workbook['Sheet1']
for row in range(1146, 1600):
s = ''
name = sheet.cell(row=row, column=6).value
url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer':'http://fanyi.youdao.com/',
'Origin': 'http://fanyi.youdao.com',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With':'XMLHttpRequest',
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Host': 'fanyi.youdao.com',
'cookie':'_ntes_nnid=937f1c788f1e087cf91d616319dc536a,1564395185984; OUTFOX_SEARCH_USER_ID_NCOO=; OUTFOX_SEARCH_USER_ID=-10218418@11.136.67.24; JSESSIONID=; ___rl__test__cookies=1'
}
dict=formdata(name)
dict=urllib.parse.urlencode(dict)
dict=str(dict)
#dict=urllib.parse.urlencode(dict).encode('utf-8')
try:
req = requests.post(url, data=dict, headers=header)
val = req.json()
translate_result = val['translateResult'][0]
except Exception as e:
print(e)
else:
if len(translate_result) > 1:
# print(len(translate_result))
for i in range(len(translate_result)):
s = s + translate_result[i]["tgt"]
sheet.cell(row=row, column=7, value=s)
print(row)
else:
translate = translate_result[0]["tgt"]
sheet.cell(row=row, column=7, value=translate)
print(row)
time.sleep(1)
workbook.save('xxxxx')
print('翻譯結束')
```
#### 二、python的第三方庫(from translate import Translator)
**下載: pip install translate (該庫下載比較慢,耐心等待)**
**該方法也是有字符限制 , 翻譯到一定字符就開始返回,意思就是說翻譯達到了上限
MYMEMORY WARNING: YOU USED ALL AVAILABLE FREE TRANSLATIONS FOR TODAY. NEXT AVAILABLE IN 15 HOURS 22 MINUTES 17 SECONDSVISIT HTTPS://MYMEMORY.TRANSLATED.NET/DOC/USAGELIMITS.PHP TO TRANSLATE MORE**
```python
from openpyxl import load_workbook
from translate import Translator
workbook = load_workbook(r'xxxx.xlsx')
sheet = workbook['Sheet1']
translator = Translator(to_lang='zh')
for row in range(2167, 3000):
key = sheet.cell(row=row, column=6).value
if len(key) > 500:
a = key[:500]
b = key[500:]
sheet.cell(row=row, column=7, value=translator.translate(a)+translator.translate(b))
else:
sheet.cell(row=row, column=7, value=translator.translate(key))
# print(translator.translate(key))
print(row)
workbook.save('xzxxx.xlsx')
print('翻譯結束')
```
#### 三、百度翻譯接口
**百度翻譯接口免費版的可以的, 就是限制訪問時間, 平均每秒訪問一次, 數據量大的話, 速度稍微有點慢
當然你有富裕的可以開通豪華版**
**百度接口就不做過多介紹了, 百度翻譯開放平台介紹的很詳細:
[https://api.fanyi.baidu.com/](https://api.fanyi.baidu.com/)**
大佬如果有更好的方法,請多多賜教, 謝謝!