爬虫系列(四) 用urllib实现英语翻译

news/2024/7/19 9:08:40 标签: 爬虫, json, python

这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块

1、准备工作

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

1459925-20190308164532947-169611116.png

2、抓包分析

打开 Network 选项卡进行监控,并选择 XHR 作为 Filter 进行过滤

然后,我们在输入框中输入待翻译的文字进行测试,可以看到列表中出现三个数据包

分别是 sug、v2transapi 和 langdetect,下面我们一个一个进行分析

1459925-20190308164541125-2069622311.png

(1)分析 sug 数据包

① 打开 sug 数据包的 Preview 选项卡查看响应结果,太棒了,里面有我们需要的翻译结果

1459925-20190308164550860-25849713.png

② 然后,我们可以打开 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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • kw : 你好 —— 翻译的内容

③ 下面祭上完整的代码

python">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/67.0.3396.99 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)

OK,一切完美解决!

等等,真的就这样结束了吗?

1459925-20190308164600269-1861293416.png

可以看到,上面的代码虽然可以完美翻译中文和英文,但是却不能翻译句子!

这可怎么办呀?别急,不是还有两个数据包没有分析嘛,再看看还有没有其它办法吧

(2)分析 v2transapi 数据包

① 打开 v2transapi 数据包的 Preview 选项卡查看响应结果,这里面竟然也有我们需要的翻译结果

1459925-20190308164615114-381841982.png

② 接下来,我们还是打开 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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • query : 你好 —— 翻译的内容
    • from : zh —— 翻译内容的语言类型,zh 代表中文,设置为 auto 可自动检测
    • to : en —— 翻译结果的语言类型,en 代表英文,设置为 auto 可自动检测
    • signtoken:加密参数

唉,只想简简单单爬个翻译,竟然还要涉及密码破解,没办法,只好请教百度了

一查才知道,原来百度翻译有一个公开的 API,根本就不需要涉及加密解密

只需要把上面的请求地址改成 https://fanyi.baidu.com/transapi 就可以了

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

python">import urllib.request
import urllib.parse
import json

def translate(text):
    # 参数检验
    if not text:
        return 'None'
    # 请求网址
    url = "https://fanyi.baidu.com/transapi"
    # 表单数据
    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/67.0.3396.99 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)

下面我们来看看效果如何?

1459925-20190308164622839-1093545879.png

嗯,效果还可以,终于也能够翻译句子了!

3、相关拓展

有道翻译的爬取和百度翻译的十分类似,这里也顺便提及一下

1459925-20190308164629587-1582790364.png

我们还是先来打开数据包的 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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36 —— 用户代理
  • Form Data:表单数据
    • i: 你好 —— 翻译的内容
    • doctype : json —— 数据类型,指定为 JSON
    • from : AUTO —— 翻译内容的语言类型,自动检测
    • to : AUTO —— 翻译结果的语言类型,自动检测
    • signsalt:加密参数

和百度翻译的很类似,都设置了加密参数,怎么办?也和百度翻译类似,修改一下请求地址就好

话不多说,直接放代码:

python">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/67.0.3396.99 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)

效果演示:

1459925-20190308164639694-1298349828.png

爬虫系列相关文章】

  • 爬虫系列(一) 网络爬虫简介

  • 爬虫系列(二) Chrome抓包分析

  • 爬虫系列(三) urllib的基本使用

  • 爬虫系列(四) 用urllib实现英语翻译

  • 爬虫系列(五) re的基本使用

  • 爬虫系列(六) 用urllib和re爬取百度贴吧

  • 爬虫系列(七) requests的基本使用

  • 爬虫系列(八) 用requests实现天气查询

  • 爬虫系列(九) xpath的基本使用

  • 爬虫系列(十) 用requests和xpath爬取豆瓣电影

  • 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论

  • 爬虫系列(十二) selenium的基本使用

  • 爬虫系列(十三) 用selenium爬取京东商品

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


http://www.niftyadmin.cn/n/930496.html

相关文章

mysql之sql 优化 explain

explain的列分析 select_type 查询类型table 查询针对的表possible_key 可能用到的索引key 最终用的索引key_len 使用的索引的最大长度type列 是指查询的方式 非常重要是分析查数据过程的重要依据ref列 指连接查询时 表之间的字段引用关系rows 是指估计要扫描多少行extra参考网…

psexec/PsExec/wmiexec

psexec/PsExec psexec依赖于对方开启admin$共享或 c$ (该共享默认开启,依赖于445端口) python版本 可以使用哈希或者用户名密码(格式域名或者工作组名/用户名)进行连接 python psexec.py -hashes LMhash(替换成实际的哈希):NTLMhash(替换成实际的哈希) start/yonghuming@10…

java执行命令的一些总结

目录 0x01 exec或者ProcessBuilder 0x02 使用ScriptEngineManager引擎 0x03 反射 0x04 自定类加载器 0x05 其他包装方式: 0x06 JNDI注入,远程加载jar ​​​​​​​ 0x01 exec或者ProcessBuilder java.lang.Runtime.getRuntime ().exec(new Str…

第一次线程使用经验总结

1.线程声明。 2. 线程使用lamda表达式。 3.使用客户端的全局变量。static的可以修改。 4.页面移除时会触发一个closed事件。从此事件中修改全局变量。 5.使得线程内的工作不再发生,只是处理完现在的线程的工作。 6.线程内方法传入bool型变量,相对于此方…

动态规划dp——天平1

题目:http://poj.org/problem?id1837 BalanceTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 16411 Accepted: 10310Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different from any ot…

Cobaltstrike 不出网正向上线

目录 Beacon TCP SMB Beacon listen中继 内网横向遇到目标不出网的几种解决方法 Beacon TCP 目标关闭防火墙,有一台主机出网,但是目标dc不出网,在原有出网主机的基础上尝试正向上线 生成分段传输Stageless的exe

MySQL索引实战总结

MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验。索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时&a…

高通 sensor 从native到HAL

app注册传感器监听 Android Sensor Framework 的整体架构如下图所示: 前几篇sensor相关的文章介绍了sensor的hal的知识,以press_sensor实时显示气压坐标来分析,app层数据获取的过程,其实实现数据监控非常简单,主要分为下面三个步骤…