客户端给服务器发送数据的请求方式有两种:post和get
思路借鉴:大佬
区别:get请求的参数会在夹杂url中(类比明信片) post请求的参数则会保存在from data中(类比写信)
而有道翻译就是很经典的post请求案列。
我在抓包工具上获得了boby信息:
i said
from AUTO
to AUTO
smartresult dict
client fanyideskweb
salt 15860279984523
sign 8794e6e13fb52862ef4239f376db451c
ts 1586027998452
bv 04578d470e7a887288dc80a9420e88ec
doctype json
version 2.1
keyfrom fanyi.web
action FY_BY_CLICKBUTTION
更换翻译词:name
i name
from AUTO
to AUTO
smartresult dict
client fanyideskweb
salt 15860282119225
sign cea422f26cc5e4ef485addabb044fc92
ts 1586028211922
bv 04578d470e7a887288dc80a9420e88ec
doctype json
version 2.1
keyfrom fanyi.web
action FY_BY_CLICKBUTTION
经过多次实验:发现只有i salt sign 会随着翻译词的变化而变化,但是除了" i "以外,其他两个参数并不知道,经过查询相关大佬的文章,借鉴代码实现了中英互译的效果。
import urllib.request
import urllib.parse
import time
import random
import hashlib
import re
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
data = {}
i=input("请输入要翻译的词:")
#i = 'I lov you baby'
data['i']=i
data['from']='AUTO'
data['to']='AUTO'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['doctype']='json'
data['version']='2.1'
data['keyfrom']='fanyi.web'
data['action']='FY_BY_REALTIME'
data['typoResult']='false'
u = 'fanyideskweb'
f = str(int(time.time()*1000)+random.randint(1,10))
c = "ebSeFb%=XZ%T[KZ)c(sy!"
sign = hashlib.md5((u+i+f+c).encode('utf-8')).hexdigest()
data['salt']=f
data['sign']=sign
data= urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html=response.read().decode('utf-8')
key=html[35:43]
a="ZH_CN2EN"
if key==a:
pattern=re.compile('"src":"(.*)",')
translate=pattern.findall(html)
result=translate[0]
print("翻译结果为:"+str(result))
else:
pattern=re.compile('"tgt":"(.*)"')
translate=pattern.findall(html)
result=translate[0]
print("翻译结果为:"+str(result))
我对 xianwan029 的代码进行了一点小小改进,让我们的输出结果更加人性化,接下来展示下试验结果。
感谢:xianwan029 的源代码提供思路让我成功爬取了页面,
如果您有任何问题,请联系。