爬虫---实现英语翻译(有道翻译)

心已赠人 2023-07-18 14:08 156阅读 0赞

翻译效果图:

在这里插入图片描述

源代码:

  1. import urllib.request #导入模块
  2. import urllib.parse
  3. import json
  4. def translate(text):
  5. # 参数检验
  6. if not text: #无内容输入
  7. return 'None'
  8. # 请求网址
  9. url = "https://fanyi.youdao.com/translate"
  10. # 表单数据
  11. params = {
  12. 'i':text,
  13. 'doctype':'json', #数据类型,指定为 JSON
  14. 'from':'AUTO',
  15. 'to':'AUTO'
  16. }
  17. data = urllib.parse.urlencode(params).encode('utf-8')
  18. # 请求头部
  19. headers = {
  20. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  21. }
  22. # 构造请求对象
  23. req = urllib.request.Request(url=url,data=data,headers=headers)
  24. # 发送请求,获得响应
  25. response = urllib.request.urlopen(req)
  26. # 解析数据
  27. content = json.loads(response.read().decode('utf-8'))
  28. if content['errorCode'] == 0: # 一切正常
  29. result_tup = (item['tgt'] for item in content['translateResult'][0])
  30. result = ''.join(result_tup)
  31. else: # 发生错误
  32. result = 'Error'
  33. # 返回结果
  34. return result
  35. if __name__ == "__main__":
  36. while True :
  37. text = input('翻译内容:')
  38. result = translate(text)
  39. print("翻译结果:%s" % result)

讲解:

一、urllib 的 request 模块 和 parse 模块

1、 request 模块(请求处理模块)

① urlopen 方法(发送请求,获得响应)

  1. urllib.request.urlopen(req)

req 参数在下一个方法会讲到的

函数整体的返回值
response = urllib.request.urlopen(req)

② Request 方法(构造请求对象)

  1. urllib.request.Request((url=url,data=data,headers=headers)

url 参数(str):请求网址
url = https://fanyi.youdao.com/translate
data 参数(bytes):表单数据,默认为 None(后面会讲到)
data = urllib.parse.urlencode(params).encode('utf-8')
headers 参数(dict):请求头部(一定要用大括号)

  1. headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

在 Network 中第一个文件的 Headers 的最下面显示
在这里插入图片描述
函数整体的返回值
req = urllib.request.Request((url=url,data=data,headers=headers)

2、 parse 模块(URL 处理模块)

就如上面的 data 参数用到的就是此模块的 urlencode 方法
data = urllib.parse.urlencode(params).encode('utf-8')
作用是将 dict 类型数据转化为 str 类型数据(并将 str 类型数据转化成 bytes 类型数据)

二、JSON 对象

先说明一下,JSON 是一种轻量级的数据格式(或者说像XML一样是一种标准)

代码开头导入了 josn 库,目的是为了用它的 loads 函数

  1. json.loads(response.read().decode('utf-8'))

作用是将已编码的 JSON 字符串解码为 Python 对象

read():返回响应体(bytes 类型),通常需要使用 decode('utf-8') 将其转化为 str 类型

函数整体的返回值
content = json.loads(response.read().decode('utf-8'))

三、解析数据

  1. if content['errorCode'] == 0: # 一切正常
  2. result_tup = (item['tgt'] for item in content['translateResult'][0])
  3. result = ''.join(result_tup)
  4. else: # 发生错误
  5. result = 'Error'

上面所述内容是基于有道翻译反爬虫机制而编写的
具体详解我也不是很清楚

四、关于 main 函数

if __name__ == '__main__' 的意思是:当 .py文件被 直接运行 时,if __name__ == '__main__'之下的代码块将被运行;当 .py文件以模块形式被 导入 时,if __name__ == '__main__'之下的代码块不被运行

但由于本源代码没有发挥出它的作用,所以写这个函数只是为了规范(好看 )

参考博客:
爬虫系列(三) urllib的基本使用
爬虫系列(四) 用urllib实现英语翻译
Python中if _ name _ == “_ main _” ,init 和self 的解析

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读