有道词典翻译(携带请求头和post参数请求)
一、静态爬取页面信息
有道翻译网址:http://fanyi.youdao.com/
在翻译中输入python
找到接口和请求的方式
参数是From Data类型
需要把参数数据转换为字典,
复制粘贴后按住Ctrl + r ,然后
Headers
内容的长度是data携带参数的长度
代码实现
分析:红色圈住的,是会根据要翻译的内容变化而变化
运行结果:
代码:
import requests
import json # 定义爬取url地址
base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' # 定义请求参数
data = {
'i': 'python',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '',
'sign': '8f6d849c13cec811c6b7ab6d0ad41eb6',
'ts': '',
'bv': '6f014bd66917f921835d1d6ae8073eb1',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'false'
} # 定义请求头部参数
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; '
'OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/71.0.3578.98 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
} # 发起请求 加入headers参数,让服务器知道是浏览器访问的
response = requests.post(base_url, data=data, headers=headers)
json_data = response.json()
print(json_data)
二、动态爬取页面信息(加密)
输入测试数据,再通过使用F12观察,其中有一条是POST请求,而向服务器发送的请求数据并不是在url里,那么我们可以试着模拟这个POST请求。
1、data字典内容:
2、headers字典内容:
3、运行结果:根据不同的单词,返回的数据不一样
4、解决问题:
从data中的参数中,我们看到”salt“和"sign"两个,这是添加数字签名的标记。也就是这两个参数的值是生成出来的,也就是说随着翻译内容的不同,这两个值可能是会变化的。
像这种动态生成的值一般会写在js脚本文件中。
(1)查找对应的js文件
(2)查看文件
双击复制Response中的内容,打开在线格式网页,如下图所示:
为了方便查看,我们在新建一个js文件,并且搜索与”salt“相关的字符,如下图所示:
分析:i在这里是什么?
(3)生产salt内容
其中
这行语句我们可以在浏览器中的控制台上输出看一下,如下图
可见是精化到毫秒(1毫秒=0.001秒)的时间戳,(用同样的方式验证:parseInt(10 * Math.random(), 10)),我们可以在python输出一个时间,两者做个对比
保留三位小数,然后把它转换为整形
所以这个在JS中生成的salt值
在python中可以这样生成:
(4)生成sign内容
推导出:sign = i.sign
- sign = n.md5("fanyideskweb" + e + i + "p09@Bn{h02_BIEe]$P^nG")
e = e.i e.i = 需要翻译的关键字
i = r + parseInt(10 * Math.random(), 10)
r = "" + (new Date).getTime()
编写程序:
编程当中需要注意的地方:
发送post请求时,需要特别注意headers的一些属性:
Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
X-Requested-With: XMLHttpRequest :表示Ajax异步请求。
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
代码如下:
import requests
import random
import time
import hashlib # md5加密函数
def getmd5(value):
# 生成MD5对象
md5 = hashlib.md5()
# 将值进行编码 编码成字符串
md5.update(bytes(value, encoding="utf-8"))
# 对字符串进行加密
sign = md5.hexdigest()
return sign def fanyi(key):
# 定义起始url
base_url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" # 生成salt和sign参数
salt = int(time.time() * ) + random.randint(, )
sign_str = "fanyideskweb" + key + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
sign = getmd5(sign_str)
data = {
'i': key,
# 'from': 'AUTO',
# 'to': 'AUTO',
# 'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
# 'ts': '',
# 'bv': '6f014bd66917f921835d1d6ae8073eb1',
# 'doctype': 'json',
# 'version': '2.1',
'keyfrom': 'fanyi.web',
# 'action': 'FY_BY_REALTIME',
# 'typoResult': 'false'
} headers = {
# 'Accept': 'application/json, text/javascript, */*; q=0.01',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept-Language': 'zh-CN,zh;q=0.9',
# 'Connection': 'keep-alive',
# 'Content-Length': '',
# 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-1632754728@10.169.0.84; JSESSIONID=aaavabYot4NQ1fAZH8sKw; OUTFOX_SEARCH_USER_ID_NCOO=933374763.1142684; ___rl__test__cookies=1550801165800',
# 'Host': 'fanyi.youdao.com',
# 'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
# 'X-Requested-With': 'XMLHttpRequest'
} # 发起请求 加入headers参数,让服务器知道是浏览器访问的
response = requests.post(base_url, data=data, headers=headers)
json_data = response.json()
print(json_data) if __name__ == "__main__":
key = input("请输入需要翻译的内容:")
fanyi(key)
有道词典翻译(携带请求头和post参数请求)的更多相关文章
- PHP发送请求头和接收打印请求头
一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...
- nginx 获取请求头,URL参数
获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...
- http请求报文格式(请求行、请求头、空行 和 请求包体)和响应报文格式(状态行、响应头部、空行 和 响应包体)
转载 出处 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求 ...
- Android-Retrofit-2.0-Post与Get-请求有道词典翻译
Retrofit-2.0版本后,内置已经集成了OKHttp,在使用Retrofit的时候 看似是Retrofit去网络请求的 实际上Retrofit只是封装,所以不要以为Retrofit是网络请求框架 ...
- Tornado—添加请求头允许跨域请求访问
跨域请求访问 如果是前后端分离,那就肯定会遇到cros跨域请求难题,可以设置一个BaseHandler,然后继承即可. class BaseHandler(tornado.web.RequestHan ...
- 使用RestTemplate发送post请求,请求头中封装参数
最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败.中文乱码等,调了好久才找到下面较为简便的方法: RestTemplate restTemplate ...
- python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)
一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...
- SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- ASP.NET Core - 实现Http自定义请求头策略
前言 在正常的情况下,当我们系统用到JWT认证方式时,需要在Http请求头添加Authorization: XXX,这样在后台服务的控制器中打上[Authorize]授权标签,就限定所有的请求必须通过 ...
随机推荐
- Devops路线
自动化运维工具 Docker学习 .
- 图片在IE8浏览器多一个有边框问题解决办法
最后在网上找了一下答案,IE8浏览器图片多一个有色边框,而Chrome浏览器没有边框的解决办法. 指定img的边框样式: img{border-style:none;}
- jsp内置对象学习记录
1.session,是一个会话保留在服务器端的对象(默认保留时间为30分钟),所以我们可以在session里面放用户信息以便后续的访问便利(缺点:cookie劫持,导致用户数据泄露).案例:(1)同个 ...
- SQL Server2008 R2 数据库镜像实施手册(双机)SQL Server2014同样适用
这篇文章主要介绍了SQL Server2008 R2 数据库镜像实施手册(双机)SQL Server2014同样适用,需要的朋友可以参考下 一.配置主备机 1. 服务器基本信息 主机名称为:HOST_ ...
- android SDK打包app
SDK 软件开发工具包(Software Development Kit) JDK 开发工具包(Java Developer's Kit) 1.搜索java jdk 进入官网 http://www ...
- iOS 开发笔记-加载/初始化
ViewDidLoad 一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图.从数据库或者网络加载模型数据装配到子视图中 在自定义控制里 initWithFrame:一般用于添加控件, ...
- 文档设计也需要坚持DRY原则--支付中心应用部署结构图完善
今天上午,我拿着支付中心的设计文档,给入职不久的同事讲解目前支付中心系统的应用部署情况.当时同事嗯嗯地点头反应. 下午呢,发现自己设计的有问题,赶紧给予完善. 代码重构方面讲究DRY编程原则.我们在设 ...
- caffe运行训练脚本时报错:Unknown bottom blob 'data' (layer 'conv1',bottom index 0)
报错的两种报错原因: 1.输入数的路径错误,需要将路径进行修改排查目录是否出错 2.训练原数据格式不对 3.train.prototxt文件中并未设置test层,而在solver层则设置了test的迭 ...
- Unity shader学习之标准的Unity shader
包含光照,可处理多个光源,有光照衰减和阴影的shader,代码如下: 转载请注明出处:http://www.cnblogs.com/jietian331/p/7199311.html Shader & ...
- [4]Windows内核情景分析---内核对象
写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...