python之post的响应爬虫——利用python实现有道翻译在线翻译


请求方式有两种,分别是get和post。之前我们用百度贴吧的方式示例了get请求的爬取,本篇博文主要介绍的post请求方式的爬取

1 post的请求方式

1.1 post和get的区别

GET : 查询参数都会在URL上显示出来(例如:百度查询字段)
POST : 查询参数和需要提交数据是隐藏在Form表单⾥的,不会在URL地址上显示出来(例如:有道翻译)

1.2 post特点

  • POST 特点
    (1)在Request方法中添加data参数 (2)urllib.request.Request(url,data=data,headers=headers)
    (3)data :表单数据以bytes类型提交,不能是str

2.利用request.urllib实现

2.1 寻找网页源代码翻译的位置

(1)右键-检查–> 查看源代码
(2)点击-Network–>查看运行状态
(3)在网页上方输入翻译的内容–如:你好–在Network界面找到translate起头的网址
(4)点开translate网址–查阅Form Data–> Form data 存储了所有查询需要的数据(其中i 是查询输入内容)
在这里插入图片描述

2.2 输入查询内容并转为字节流

# 把提交的form表单的数据转换为bytes类型的数据
# 请输入你要翻译的内容
key = input('请输入您要翻译的内容:')
data = {
    'i': key,
    'from': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15880623642174',
    'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
    'ts': '1588062364217',
    'bv': '42160534cfa82a6884077598362bbc9d',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom':'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION'
}

data = urllib.parse.urlencode(data)  # 把data转换十六进制
data = bytes(data,'utf-8') # 把data转换成字节流

2.3 利用request.urllib实现请求

# 利用request.urllib实现请求
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'  # 注意此处的url是Request URL,并且需要把_o去掉才能实现,否则返回的html是{"errorCode":50}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
req = urllib.request.Request(url,headers=headers,data=data)  # headers是传入个人设置、data是输入数据
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html,type(html))
# 结果: {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":1,"translateResult":[[{"src":"你好","tgt":"hello"}]]}  <class 'str'>

2.4 美化输出结果

# html输出的结果较为不美观,并且为str,不是字典,不能通过关键字取出
# 所以我们需将html转为字典,再进行取值
import json
r_dict = json.loads(html)   # 把json类型的字符串转换为字典
r = r_dict['translateResult'] #  [[{"src":"name","tgt":"的名字"}]]
result = r[0][0]['tgt'] # [{"src":"name","tgt":"的名字"}] -->{"src":"name","tgt":"的名字"}
print(result)  # 你好

3.利用requests实现

requests方法的实现直接采用requests.post()方法实现就好

# 利用requests方法
import requests

key = input('请输入您要翻译的内容:')
data = {
    'i': key,
    'from': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15880623642174',
    'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
    'ts': '1588062364217',
    'bv': '42160534cfa82a6884077598362bbc9d',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom':'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION'
}
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'  # 注意此处的url是Request URL,并且需要把_o去掉才能实现,否则返回的html是{"errorCode":50}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
res = requests.post(url,data=data,headers=headers) # 采用post方法
res.encoding = 'utf-8'
html = res.text
r_dict = json.loads(html)
result = r_dict['translateResult'][0][0]['tgt']
print(result)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值