爬虫系列(四) 用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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 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/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,一切完美解决!
等等,真的就这样结束了吗?
可以看到,上面的代码虽然可以完美翻译中文和英文,但是却不能翻译句子!
这可怎么办呀?别急,不是还有两个数据包没有分析嘛,再看看还有没有其它办法吧
(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; 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 可自动检测sign
和token
:加密参数
唉,只想简简单单爬个翻译,竟然还要涉及密码破解,没办法,只好请教百度了
一查才知道,原来百度翻译有一个公开的 API,根本就不需要涉及加密解密
只需要把上面的请求地址改成 https://fanyi.baidu.com/transapi 就可以了
③ 下面同样祭上完整的代码,其实和上面的十分类似
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)
下面我们来看看效果如何?
嗯,效果还可以,终于也能够翻译句子了!
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; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36
—— 用户代理
- Form Data:表单数据
i: 你好
—— 翻译的内容doctype : json
—— 数据类型,指定为 JSONfrom : AUTO
—— 翻译内容的语言类型,自动检测to : AUTO
—— 翻译结果的语言类型,自动检测sign
和salt
:加密参数
和百度翻译的很类似,都设置了加密参数,怎么办?也和百度翻译类似,修改一下请求地址就好
话不多说,直接放代码:
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)
效果演示:
【爬虫系列相关文章】
爬虫系列(四) 用urllib实现英语翻译的更多相关文章
- 爬虫系列(六) 用urllib和re爬取百度贴吧
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...
- Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 转 Python爬虫入门四之Urllib库的高级用法
静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...
- Java爬虫系列四:使用selenium-java爬取js异步请求的数据
在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何用jsoup分析html源文件内容得到我们想要的数据,但是有时候通过这两种方式不能正常抓取到我们想要的数据,比如看如下例子. ...
- 4.Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 爬虫系列(三) urllib的基本使用
一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...
- 爬虫系列(九) xpath的基本使用
一.xpath 简介 究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言 而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档: &l ...
- 爬虫系列(二) Chrome抓包分析
在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...
- 爬虫系列(五) re的基本使用
1.简介 究竟什么是正则表达式 (Regular Expression) 呢?可以用下面的一句话简单概括: 正则表达式是一组特殊的 字符序列,由一些事先定义好的字符以及这些字符的组合形成,常常用于 匹 ...
随机推荐
- hdu1595find the longest of the shortest 最短路
//给一个无向图,问删除一条边,使得从1到n的最短路最长 //问这个最长路 //这个删除的边必定在最短路上,假设不在.那么走这条最短路肯定比其它短 //枚举删除这条最短路的边,找其最长的即为答案 #i ...
- Swift开发教程--怎样清除模拟器的数据
打开xcode->preference->location->derived Data,进入文件夹下,删除里面所以后的文件夹就能够了.
- Deep Learning Toolboxs
一些好用的 Deep learning toolboxs DeepLearningToolbox MATLAB实现,能够使用CPU或GPU.GPU运算用gpumat实现.改动内核代码很方便 支持主要的 ...
- jQuery - 当当网我的订单页
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- tarjan用法——割点
今天洛谷疯狂给我推送tarjan的题(它好像发现了我最近学tarjan),我正好做一做试一试(顺便练一练快读和宏定义). 其实找割点的tarjan和算强连通分量的tarjan不一样,找割点的判定条件比 ...
- Gym - 101981J The 2018 ICPC Asia Nanjing Regional Contest J.Prime Game 计数
题面 题意:1e6的数组(1<a[i]<1e6), mul (l,r) =l × (l+1) ×...× r, fac(l,r) 代表 mul(l,r) 中不同素因子的个数,求s ...
- lowbit( )运算
--------开始-------- lowbit (n) 定义为非负整数n在二进制表示下“最低位的1及其后面所有的0构成的数值. 比如: n = 10 的二进制下为1010,则lowbit (n) ...
- TCP/IP详解(一)
SYN中的MSS选项是告诉对端,本端在本地连接的每个TCP分节中愿意接收的最大数据量.发送端TCP使用接收端的MSS值作为发送分节的最大大小. TCP半关闭使用的情况较少,可用于通知对端本端数据已输入 ...
- Blender之UILayout
目标 [x] 总结Blender面板布局 总结 Blender面板中界面组件是通过UILayout进行组织的. 其主要属性如下: row() 定义横向子布局. column() 定义竖向子布局. sp ...
- Spring Boot (10) mybatis三种动态sql
脚本SQL xml配置方式见mybatis讲解,下面是用<script>的方式把它照搬过来,用注解来实现.适于xml配置转换到注解配置 @Select("<script&g ...