思路:“输入文本” → “翻译” → “得到译文”
Ps:这个思路好像有点那啥哈哈哈哈(是个正常人都知道的思路)
好的,现在让我们直接进入主题:
第一步的 “输入文本” 谁都会了,直接跳过 (扣扣键盘的事)。
进入第二步(重点来了):要实现 “翻译” 这一步其实有很多种方式可以实现,今天我们就使用python的 requests库 来帮我们实现(爬百度的翻译网站百度翻译-200种语言互译、沟通全世界!)。
使用 requests库 首先就要安装,还有一个 execjs库 也要安装
pip install resquests
pip install execjs
Ps:如果是使用其他Python IDE的话,好像就直接自带了requests库(我自己就用的PyCharm)
①. 现在我们就要正式开始撸代码了,首先调用两个需要到的第三方库
import requests # requests库 进行网络请求
import execjs # execjs库 用来执行js语句
②. 设置 请求头
headers = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '这里填写自己的cookie',
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang'
'=auto2zh',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/93.0.4577.82 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
③. 因为百度翻译反爬机制,经过观察只加密了sign数据,由代码计算,将js文件保存在根目录下(想看js文件的私信我哦)
info = input('Please enter the text to translate:')
with open('sign.js') as f:
jsData = f.read()
sign = execjs.compile(jsData).call('e', info) # 打开js文件用execjs库处理并计算出sign
④. 设置 data参数
data = {
'from': 'zh',
'to': 'en',
'query': info, # info 是变量存储输入的字符串
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': sign, # sign 是解密后的标签变量
'token': '2d870ff8c7b08691879fdb3058988f46',
'domain': 'common'
}
⑤. 获取 cookies
render_url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"
cookiejar = requests.get(render_url, headers=headers).cookies
cookies = requests.utils.dict_from_cookiejar(cookiejar)
⑥. 发送 post请求,返回的是经过‘utf-8’编码后的字符串,我们要对其进行解码,并且转化为字典,直接对数据进行类型转换会报错“NameError: name 'null' is not defined”
报错原因:Python不能处理null这样的字符串
解决办法:把null当成变量,提前定义:null=''
global null
null = ''
result = requests.post(render_url, headers=headers, data=data, cookies=cookies)
text = eval(result.text.encode('utf-8').decode('utf-8')) # 需要null
第三步:在数据(字典)中将我们要的结果提取出来
print('Translation results: ' + text['trans_result']['data'][0]['dst'] + '\n')
本篇分享到这里也快就要结束了,首先谢谢各位看官的观看(不凡点个免费的赞再走吧哈哈哈)最后将代码全部总结起来,看起来也比较有思路。
import requests
import execjs
headers = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '这里输入自己的cookie',
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang'
'=auto2zh',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/93.0.4577.82 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
global null
null = ''
while True:
info = input('Please enter the text to translate:')
with open('sign.js') as f:
jsData = f.read()
sign = execjs.compile(jsData).call('e', info)
data = {
'from': 'zh',
'to': 'en',
'query': info,
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': sign,
'token': '2d870ff8c7b08691879fdb3058988f46',
'domain': 'common'
}
render_url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"
cookiejar = requests.get(render_url, headers=headers).cookies
cookies = requests.utils.dict_from_cookiejar(cookiejar)
result = requests.post(render_url, headers=headers, data=data, cookies=cookies)
text = eval(result.text.encode('utf-8').decode('utf-8'))
print('Translation results: ' + text['trans_result']['data'][0]['dst'] + '\n')
print('---------------------------------')