目录
概述
爬取有道翻译,根据提供的词汇进行翻译。
准备
所需模块
- urllib.parse
- urllib.request
- re(不是必要的)
- json
涉及知识点
- python基础
- urllib模块基础
- re模块的简单运用(不是必须的)
运行效果
控制台打印:
完成爬虫
1. 分析网页
进入有道翻译后,按F12分页网页
同时注意:
由于是POST提交方式,因此需要form data
分析网页可知,需要的URL是:
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
但是这个URL是无法使用的,可以是使用是下面这个(对上面的URL进行了小改动):
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
而表单数据是:
form_data = {
"i": "hello",
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "15749948169760",
"sign": "287760012f276620e8eaed1e00aff339",
"ts": "1574994816976",
"bv": "319767f82622c78aa4241bb7a80c5077",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
因此查询文字,只需要更换i的值就可以了。
2. 爬虫代码
import json
import urllib.parse
import urllib.request
# 有道翻译
# 请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}
# 需要访问的URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
key = input("请输入你要翻译的文字:")
# 发送POST必须构造Form Data
form_data = {
"i": key,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "15749948169760",
"sign": "287760012f276620e8eaed1e00aff339",
"ts": "1574994816976",
"bv": "319767f82622c78aa4241bb7a80c5077",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
data = urllib.parse.urlencode(form_data).encode(encoding="utf-8") # 对表单数据进行UTF-8编码
req = urllib.request.Request(url, data=data, headers=header)
# 响应的数据是通过Ajax返回的JSON格式数据
resp = urllib.request.urlopen(req).read().decode()
# 注意:这里resp返回的是一个JSON格式的数据,必须进行转换才能使python语法生效
print(json.loads(resp)["translateResult"][0][0]["tgt"])
3. 使用re模块处理结果
上面的代码结果是按照python语法来获取值的,下面可以用正则表达式来获取需要的结果,也就是re模块发挥作用的时候了。
import re
import urllib.parse
import urllib.request
# 有道翻译
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
key = input("请输入你要翻译的文字:")
# 发送POST必须构造Form Data
form_data = {
"i": key,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "15749948169760",
"sign": "287760012f276620e8eaed1e00aff339",
"ts": "1574994816976",
"bv": "319767f82622c78aa4241bb7a80c5077",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
data = urllib.parse.urlencode(form_data).encode(encoding="utf-8") # 对表单数据进行UTF-8编码
req = urllib.request.Request(url, data=data, headers=header)
# 响应的数据是通过Ajax返回的JSON格式数据
resp = urllib.request.urlopen(req).read().decode()
# 正则表达式,提取"tat":"和"}]]中间的任意内容
pat = r'tgt":"(.*?)"}]]' # 正则表达式
result = re.findall(pat, resp) # 正则表达式转换
print(result[0]) # 输出获取结果
结果如上运行效果所示。