python爬虫实践之有道翻译

目录

概述

准备

所需模块

涉及知识点

运行效果

完成爬虫

1. 分析网页

2. 爬虫代码

3. 使用re模块处理结果



概述

爬取有道翻译,根据提供的词汇进行翻译。

准备

所需模块

  • 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])  # 输出获取结果

结果如上运行效果所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值