失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python3—爬虫实现有道翻译—(常见错误汇总及解决方法)

Python3—爬虫实现有道翻译—(常见错误汇总及解决方法)

时间:2021-06-17 03:37:51

相关推荐

Python3—爬虫实现有道翻译—(常见错误汇总及解决方法)

Python 全栈工程师核心面试 300 问深入解析( 版)----全文预览

Python 全栈工程师核心面试 300 问深入解析( 版)----欢迎订阅

今天尝试了一个Python3的爬虫项目:

Python3实现有道在线翻译

代码实现过程中遇到一些问题,经过研究都找到了对应的解决方法,先将遇到的问题和解决方法汇总如下,供大家参考:

有道在线翻译是POST实现的,百度翻译也是。

有道翻译每次翻译的时候,最上方地址栏中的地址时固定不变的,可以猜测有道是通过post请求实现翻译功能的。

POST与GET的区别:

POST请求的参数都在放在formdata中,可以查看有道翻译,翻译一个单词,检查network中headers,里面有formdata,里面有发送请求的相关参数。浏览器地址栏中的网址没有发生变化。可以参考有道翻译:

/

get请求:请求的参数直接放在url地址之中,请求的参数进行url编码直接放在地址中,可以参考豆瓣的电影排行榜:

/typerank?type_name=剧情&type=11&interval_id=100:90&action=

(注:判断post与get请求最显著的区别就是url地址是否发生变化,发生变化了就是get,反之则是post请求,post请求的参数是在表单里)

先放最终项目实现的源码:

# Python3实现有道在线翻译案例# 有道在线翻译/import jsonfrom urllib import request, parseif __name__ == '__main__':key = input("请输入需要翻译的文字(输入完成后请按Enter): ")# 打开有道在线翻译,输入girl,检查,找到headers,复制里面的网址url = '/translate?smartresult=dict&smartresult=rule'# 将网页中的Form Data中的所有数据复制出来# 通过调试发现,只需要其中的i对应要翻译的内容和doctype对应的数据格式formdata = {'i': key,'doctype': 'json',}# formdata中的数据需要转换为bytes格式data = parse.urlencode(formdata).encode()# 将网页中的请求头Request Headers中的数据复制出来,只需要一个用户代理即可headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71',}# 请求网页req = request.Request(url=url, data=data, headers=headers)# 返回网页res = request.urlopen(req)# 下载导出数据result = json.loads(res.read())# 打印出翻译后的结果print("\n翻译结果: " + result["translateResult"][0][0]["tgt"])

输出结果:

中译英请输入需要翻译的文字(输入完成后请按Enter): 我爱你,亲爱的包包翻译结果: I love you, my dear bag英译中请输入需要翻译的文字(输入完成后请按Enter): I LOVE YOU BABY翻译结果: 我爱你宝贝

问题汇总

问题1:

出现以下错误:“errorcode”:50

解决方法:将原网址中的_o删除

- 原网址:/translate_o?smartresult=dict&smartresult=rule

- 修改后网址:/translate?smartresult=dict&smartresult=rule

- _o的可能用途:有道翻译在线进行了加密过程,检查源码发现formdata中有salt(俗称加盐,一个附加的字符串,附加之后然后进行加密,类似于一般用户输入密码位数有限,服务器会给密码附加一串随机的数值,然后再进行加密,加密一般都是JS加密)和sign(加密后的字段)两个数据

- 如果要用带_o的网址,需要将这两个参数带上,但是只能翻译你网页刚刚翻译的那个单词,翻译其它的代码会一直处于等待状态。。。可能是加密引起的。

**

问题2:

**

翻译没有结果显示,或者提示编码错误

解决方法:

请求头中只保留用户代理,还是不行更换用户代理

用户代理地址参考:

/u011318077/article/details/86508095formdata中删除非关键参数,只保留以上代码中的键值

本文部分内容参考以下文章:

https://mp./s/L1GNT-cfY5KltU16jbHVsA

/thread-86581-1-1.html

如果大家还遇到其它问题,欢迎回复补充

如果觉得《Python3—爬虫实现有道翻译—(常见错误汇总及解决方法)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。