网络爬虫系列(三):用urllib实现英语翻译

网络爬虫系列(三):用urllib实现英语翻译

1. 准备工作

首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器自带的开发者工具对网站进行抓包分析。
在这里插入图片描述

2. 抓包分析

打开 Network 选项卡进行监控,并选择 XHR 作为 Filter 进行过滤。然后,我们在输入框中输入待翻译的文字进行测试,列表中的数据包:有 sug、v2transapi 和 langdetect,下面我们一个一个进行分析。

(1)分析 sug 数据包

① 打开 sug 数据包的 Preview 选项卡查看响应结果,太棒了,里面有我们需要的翻译结果。
在这里插入图片描述
② 然后,我们可以打开 sug 数据包的 Headers 选项卡分析请求数据,使用程序模拟发送请求,基本信息如下:

  • General:基本参数
    • Request URL : https://fanyi.baidu.com/sug —— 请求网址
    • Request Method : POST —— 请求方法,POST 请求方法的请求参数放在 Form Data 中
  • Request Headers:请求头部
    • User-Agent : Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • kw : 你好 —— 翻译的内容

③ 下面祭上完整的代码

import urllib.request
import urllib.parse
import json

def translate(text):
    # 参数检验
    if not text:
        return 'None'
    # 请求网址
    url = "https://fanyi.baidu.com/sug"
    # 表单数据
    params = {
        'kw':text
    }
    data = urllib.parse.urlencode(params).encode('utf-8')
    # 请求头部
    headers = { 
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    # 构造请求对象
    req = urllib.request.Request(url=url,data=data,headers=headers)
    # 发送请求,获得响应
    response = urllib.request.urlopen(req)
    # 解析数据
    content = json.loads(response.read().decode('utf-8'))
    if content['errno'] == 0: # 一切正常
        result = content['data'][0]['v']
    else: # 发生错误
        result = 'Error'
    # 返回结果
    return result

if __name__ == "__main__":
    while True :
        text = input('翻译内容:')
        result = translate(text)
        print("翻译结果:%s" % result)

可以看到,上面的代码可以完美翻译中文和英文。(但在处理句子时出现问题,正在研究解决方案)
在这里插入图片描述
(2)分析 v2transapi 数据包
① 打开 v2transapi 数据包的 Preview 选项卡查看响应结果,这里面竟然也有我们需要的翻译结果
在这里插入图片描述
② 接下来,我们还是打开 v2transapi 数据包的 Headers 选项卡查看请求数据,其基本信息如下:

  • General:基本参数
    • Request URL : https://fanyi.baidu.com/v2transapi —— 请求网址
    • Request Method : POST —— 请求方法,POST 请求方法的请求参数放在 Form Data 中
  • Request Headers:请求头部
    • User-Agent : Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • query : 你好 —— 翻译的内容
    • from : zh —— 翻译内容的语言类型,zh 代表中文,设置为 auto 可自动检测
    • to : en —— 翻译结果的语言类型,en 代表英文,设置为 auto 可自动检测
    • sign 和 token:加密参数

③ 下面同样祭上完整的代码,其实和上面的十分类似

import urllib.request
import urllib.parse
import json

def translate(text):
    # 参数检验
    if not text:
        return 'None'
    # 请求网址
    url = "https://fanyi.baidu.com/v2transapi"
    # 表单数据
    params = {
        'query':text,
        'from':'auto',
        'to':'auto'
    }
    data = urllib.parse.urlencode(params).encode('utf-8')
    # 请求头部
    headers = { 
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    # 构造请求对象
    req = urllib.request.Request(url=url,data=data,headers=headers)
    # 发送请求,获得响应
    response = urllib.request.urlopen(req)
    # 解析数据
    content = json.loads(response.read().decode('utf-8'))
    result = content['data'][0]['dst']
    # 返回结果
    return result

if __name__ == "__main__":
    while True :
        text = input('翻译内容:')
        result = translate(text)
        print("翻译结果:%s" % result)

翻译结果如图所示
在这里插入图片描述
结果报错显示请求页面被加密。需要研究密码破解问题。

之前有人这样做,使用百度翻译一个公开的 API,根本就不需要涉及加密解密。只需要把上面的请求地址改成 https://fanyi.baidu.com/transapi 就可以。经过测试发现结果依旧报错。

urllib.error.HTTPError:HTTPError 401:Unauthorized

3、相关拓展

有道翻译的爬取和百度翻译的十分类似。
在这里插入图片描述
首先,我们先来打开数据包的 Headers 选项卡查看请求数据,其基本信息如下:
在这里插入图片描述

  • General:基本参数
    • Request URL : http://fanyi.youdao.com/translate_o —— 请求网址
    • Request Method : POST —— 请求方法,POST 请求方法的请求参数放在 Form Data 中
  • Request Headers:请求头部
    - User-Agent : Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • i: 你好 —— 翻译的内容
    • doctype : json —— 数据类型,指定为 JSON
    • from : AUTO —— 翻译内容的语言类型,自动检测
    • to : AUTO —— 翻译结果的语言类型,自动检测
    • signsalt:加密参数
      和百度翻译的很类似,都设置了加密参数。和百度翻译类似,修改一下请求地址就好

代码展示:

import urllib.request
import urllib.parse
import json

def translate(text):
    # 参数检验
    if not text:
        return 'None'
    # 请求网址
    url = "https://fanyi.youdao.com/translate"
    # 表单数据
    params = {
        'i':text,
        'doctype':'json',
        'from':'AUTO',
        'to':'AUTO'
    }
    data = urllib.parse.urlencode(params).encode('utf-8')
    # 请求头部
    headers = { 
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    }
    # 构造请求对象
    req = urllib.request.Request(url=url,data=data,headers=headers)
    # 发送请求,获得响应
    response = urllib.request.urlopen(req)
    # 解析数据
    content = json.loads(response.read().decode('utf-8'))
    if content['errorCode'] == 0: # 一切正常
        result_tup = (item['tgt'] for item in content['translateResult'][0])
        result =  ''.join(result_tup)
    else: # 发生错误
        result = 'Error'
    # 返回结果
    return result

if __name__ == "__main__":
    while True :
        text = input('翻译内容:')
        result = translate(text)
        print("翻译结果:%s" % result)

效果演示:
在这里插入图片描述

转载自https://www.cnblogs.com/wsmrzx/p/9462246.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值