风百默 发表于 2022-5-6 13:23:06

为什么我这样会报错

本帖最后由 风百默 于 2022-5-6 13:48 编辑


import urllib.request
import urllib.parse
import json
content = input('请输入要翻译的内容:')
url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
data = {}
data['i'] = 'l love'
data['from'] = 'AUTO'
data['to'] =['AUTO']
data['smartresult'] = ['dict']
data['client'] = ['fanyideskweb']
data['salt'] = ['16518125282681']
data['sign'] = ['6692eb68459b9c16e49b4c2fa6e51411']
data['lts'] = ['1651812528268']
data['bv'] = ['247811f9b7fd387f154bf67d8ebd44f3']
data['doctype'] = ['json']
data['version'] = ['2.1']
data['keyfrom'] = ['fanyi.web']
data['action'] = ['FY_BY_CLICKBUTTION']
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)
target = json.loads(html)
print('翻译结果:%s'%(target['translateResult']['tgt']))

wp231957 发表于 2022-5-6 13:26:59

要发文本代码哦

isdkz 发表于 2022-5-6 13:28:11

得到的数据不对,你先 print 一下 target 看看

makliu 发表于 2022-5-6 13:29:53

target 字典 不存在 那个key吧, 检查下是不是写错了字母。~

风百默 发表于 2022-5-6 13:42:43

isdkz 发表于 2022-5-6 13:28
得到的数据不对,你先 print 一下 target 看看

和print(html)的值一样

Twilight6 发表于 2022-5-6 13:43:50

本帖最后由 Twilight6 于 2022-5-6 13:45 编辑



把你 url 中的 _o 去掉就行了

有道反爬虫,url 中的 _o 去掉

就能去向真正服务器了,响应会正确的结果

isdkz 发表于 2022-5-6 13:44:16

风百默 发表于 2022-5-6 13:42
和print(html)的值一样

你的接口写错了,把 url 的 translate_o 中的 _o 去掉

风百默 发表于 2022-5-6 13:48:38

wp231957 发表于 2022-5-6 13:26
要发文本代码哦

已发

风百默 发表于 2022-5-6 13:51:17

isdkz 发表于 2022-5-6 13:44
你的接口写错了,把 url 的 translate_o 中的 _o 去掉


还是报错

风百默 发表于 2022-5-6 13:56:20

Twilight6 发表于 2022-5-6 13:43
把你 url 中的 _o 去掉就行了

有道反爬虫,url 中的 _o 去掉


后面的还是报错了

Twilight6 发表于 2022-5-6 13:23:07


键值对是字符串,你把值弄成了列表了,参考代码:

import urllib.request
import urllib.parse
import json
content = input('请输入要翻译的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['i'] = content
data['from'] = 'AUTO'
data['to'] ='AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = '16518125282681'
data['sign'] = '6692eb68459b9c16e49b4c2fa6e51411'
data['lts'] = '1651812528268'
data['bv'] = '247811f9b7fd387f154bf67d8ebd44f3'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CLICKBUTTION'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)
target = json.loads(html)
print('翻译结果:%s'%(target['translateResult']['tgt']))

Twilight6 发表于 2022-5-6 13:57:59

Twilight6 发表于 2022-5-6 13:56
键值对是字符串,你把值弄成了列表了,参考代码:



另外你data['i'] 那要等于 content ,你写死了

风百默 发表于 2022-5-6 14:06:48

Twilight6 发表于 2022-5-6 13:43
把你 url 中的 _o 去掉就行了

有道反爬虫,url 中的 _o 去掉


已经运行成功了,谢谢,但我不明白这个要去掉的原因是什么?

Twilight6 发表于 2022-5-6 14:09:41

风百默 发表于 2022-5-6 14:06
已经运行成功了,谢谢,但我不明白这个要去掉的原因是什么?



网易一个反爬呗,在服务器接收道请求时候 看是来自带 _o 的就响应返回一个错误的数据

风百默 发表于 2022-5-6 14:29:54

Twilight6 发表于 2022-5-6 14:09
网易一个反爬呗,在服务器接收道请求时候 看是来自带 _o 的就响应返回一个错误的数据

那在什么种形式下,需要去掉_o,还是说只要有_o就要去掉

Twilight6 发表于 2022-5-6 14:36:01

风百默 发表于 2022-5-6 14:29
那在什么种形式下,需要去掉_o,还是说只要有_o就要去掉



这只是网易的,主要是你要理解官方可能有各种反扒机制

你在学习阶段中见到一种学习一种,有可能你下次见到和这个一样也用 _o 也有可能用其他的字符

但因为我们遇到过,就积累了经验,下次有可能就能想到类似反扒解决方案,然后逐步去尝试是否能成功解决反扒

风百默 发表于 2022-5-6 17:20:41

Twilight6 发表于 2022-5-6 14:36
这只是网易的,主要是你要理解官方可能有各种反扒机制

你在学习阶段中见到一种学习一种,有可能你 ...

好的👌,谢谢

风百默 发表于 2022-5-7 12:29:20

Twilight6 发表于 2022-5-6 14:36
这只是网易的,主要是你要理解官方可能有各种反扒机制

你在学习阶段中见到一种学习一种,有可能你 ...

大佬,我还想再问你一个问题为什么第20行要用encode(utf-8),它那个网页本身不就是utf-8的方式编码的吗?

Twilight6 发表于 2022-5-7 12:42:06

风百默 发表于 2022-5-7 12:29
大佬,我还想再问你一个问题为什么第20行要用encode(utf-8),它那个网页本身不就是utf-8的方式编码的吗?



read 方法读取网页内容返回的是 bytes 对象,即二进制对象,需要重新编码

风百默 发表于 2022-5-7 13:04:55

Twilight6 发表于 2022-5-7 12:42
read 方法读取网页内容返回的是 bytes 对象,即二进制对象,需要重新编码

大佬怎么判断是否需要重新编码
页: [1] 2
查看完整版本: 为什么我这样会报错