首先感谢浪子文三少提供的没有反爬手段的翻译网站:http://fy.iciba.com/
浪子文三少原文:https://blog.youkuaiyun.com/weixin_43808690/article/details/87886075
话不多说,直接开始讲过程
基本思路
打开网站->给网站传递信息->接收网站返回的信息->输出接收的信息
1.第一步,打开IDLE,或者别的编辑软件
2.利用浏览器打开http://fy.iciba.com/,鼠标右键检索元素,展开如下图所示界面,选取Network
3.随便输入什么内容,点选翻译,找到Preview
在name那里可能会有很多东西,或者不用这个翻译网站的朋友可以翻找一下,当在Preview那里看到翻译过后的文本,说明我们找对了地方,点开Headers
4.找到Request URL(我们利用代码实际打开的网址)、User-Agent(伪装用的数据)、From Data(代码提交数据的表单)
5.开始写代码
content = input('请输入需要翻译的内容(输入"q!"退出程序):')
#第一步,获取url,注意是实际我们要用的网址,不是这个翻译网址
url = 'http://fy.iciba.com/ajax.php?a=fy'
#第二步,打包好我们要用的数据
data = {'f':'auto','t','auto','w':content}
封装好所有的我们需要给网站的提供的数据之后,我们开始根据基本思路,编写代码
5.1)打开网站,传入我们需要的值
# 在Python中,Unicode类型是作为编码的基础类型,因此,我们的data数据要进行编码,然后传值
# encode decode
# str ---------> str(Unicode) ---------> str
# 同样的,我们从网页获取的数据同样是Unicode形式,需要解码
data = urllib.parse.urlencode(data).encode('utf-8')
# 打开网页,并传值,同时伪装我们的User-Agent,如果不进行伪装,网站会知道我们是利用代码进行访问
req = urllib.request.Request(url,data)
req.add_header('User-Agent','从之前步骤中你自己复制的User-Agent值')
response = urllib.request.urlopen(req)
5.2)接收网站传回来的信息
html = response.read().decode('utf-8')
这里直接打印print(html)
发现打印出来的文件为
{"status":1,"content":{"from":"zh-CN","to":"en-US","out":"I love you","vendor":"ciba","err_no":0}}
很明显,虽然我们获取了传过来的值,并且可以看出"I love you"确实得到了翻译
但这个数据是不够美观,返回来的值是一个str类型的json数据,在Python中显示为字典嵌套字典的形式
因此我们的输出可以改为
# 对html的数据进行json数据解码,转换成字典形式
target = json.loads(html)
print("翻译结果为:%s"%(target['content']['out']))
完整代码
import urllib.request
import urllib.parse
import json
while True:
content = input('请输入需要翻译的内容(输入"q!"退出程序):')
if content == 'q!':
break
url = 'http://fy.iciba.com/ajax.php?a=fy'
data = {'f':'auto','t':'auto','w':content}
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data)
req.add_header('User-Agent','自己复制的User-Agent')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
target = json.loads(html)
if target['status'] == 1:
print("翻译结果为:%s"%(target['content']['out']))
else:
print("翻译结果为:")
for eachTrans in target['content']['word_mean']:
print(eachTrans)
优化
完整代码进行了优化,经过测试,返回数据当中的status数据,是对提交数据的一个判断,如果返回的是一个单词或短语,网站会返回一个新的内容,要提取翻译的内容需要修改部分数据
如果不进行该项优化,再提交部分翻译的时候,会发生错误,错误名NameErrors
同时进行了循环操作,可以不断进行试验
该代码有待进一步的优化