有道词典翻译(携带请求头和post参数请求)

一、静态爬取页面信息

body { background-color: #f4ede3 }
.box { width: 600px }

有道翻译网址: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‘: ‘15508011658043‘,
    ‘sign‘: ‘8f6d849c13cec811c6b7ab6d0ad41eb6‘,
    ‘ts‘: ‘1550801165804‘,
    ‘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‘: ‘256‘,
    ‘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

  1. 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() * 1000) + random.randint(0, 10)
    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‘: ‘1550801165804‘,
        # ‘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‘: ‘256‘,
        # ‘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)

原文地址:https://www.cnblogs.com/renshaoqi/p/10420451.html

时间: 2024-11-09 10:34:23

有道词典翻译(携带请求头和post参数请求)的相关文章

PHP发送请求头和接收打印请求头

一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, 'suibianzhi: '.$basic, ); //使用curl发送 $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, f

利用volley进行http设置请求头、超时及请求参数设置(post)

这里以post请求说明,get请求相似设置请求头及超时. 1.自定义request,继承com.android.volley.Request 2.构造方法实现(basecallback,为自定义的监听,实现Response.Listener,ErrorListener接口)--post请求 public BaseRequest(String url,String params, BaseCallback<T> callback)      {   super(Method.POST, url,

go 客户端的请求带有请求头和cookie值得请求

基础概念 请求:客户端访问服务端 响应:服务端对客户端的应答 示例图 带有特殊请求头和cookie值得客户端请求方式 使用:http.NewRequest,Do()组合.并且在创建请求的时候,带上cookie值和其他请求头 参考代码 package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "time&qu

请求头鉴权、请求参数加密、返回值解密

(1)进行接口测试的时候,写好接口测试用例,然后模拟请求的时候,会出现请求头鉴权.给你了key值那么可以 import hashlibimport timeimport base64 def get_sha1(str_data): sha1_str = hashlib.sha1(str(str_data)).hexdigest() print sha1_str return sha1_str def get_md5(imsi): imsi_md5 = hashlib.md5() imsi_md5

python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)

一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads/item/201111/24/20111124222137_wHYwc.jpg") cat_img = response.read() with open('cat_0.jpeg', 'wb') as f: f.write(cat_img) urlopen()中的url可以是string,也可以是

Python爬虫实践 —— 3.利用爬虫提取返回值,模拟有道词典接口

有道词典的web接口,实际上可以用爬虫模拟,输入key,拼接为有道词典接口的formdata,爬取返回值,实际为Ajax动态生成的translation,这样外部来看实现了翻译接口的模拟,相当于爬虫模拟浏览器调用了有道词典web接口,其实讲真的话来说,直接调用有道web接口,传json参数就可以了,不用这么费事,但爬虫模拟了人登陆web,输入关键词,获得翻译结果的过程. 浏览器输入操作,解析有道词典翻译的web接口url和格式 #爬虫模拟调用有道词典web接口调用 from urllib imp

网易有道词典下载|网易有道词典app下载

电子词典改变了传统的利用字母排序翻找纸质词典的查词方式,有效提高了查找的速度,形成了一种更加轻量化的查字典的方式,网易有道是比较早期就涉足电子词典的应用之一,整体上来看词库量庞大,核心功能完整,很好地帮助用户高效地理解外语,但是在适应场景上还有很大的提升空间.网易有道词典下载链接网易有道词典是由网易有道推出的一款搜索引擎的各种语言翻译软件.支持中文.英语.日语.韩语.法语.德语.西班牙语.葡萄牙语.俄语.藏语等多语种翻译.在线翻译.离线翻译.拍照翻译.语音翻译更顺畅.权威词典:完整收录<朗文当代

HTTP响应头和请求头信息对照表

HTTP请求头提供了关于请求,响应或者其他的发送实体的信息.HTTP的头信息包括通用头.请求头.响应头和实体头四个部分.每个头域由一个域名,冒号(:)和域值三部分组成. 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联. 请求头标:允许客户端传递关于自身的信息和希望的响应形式. 响应头标:服务器和于传递自身信息的响应. 实体头标:定义被传送资源的信息.即可用于请求,也可用于响应. 根据以上分类的HTTP请求头介绍可以参考此文,本工具根据请求和输出分为Request和

Hessian客户端向服务端发送请求头

Hessian客户端向服务端发送数据 场景:项目日志Token处理,即用户发送一个请求时生成一个日志Token,该Token从各个服务之间传递,并使用该Token记录日志,直至请求结束.可以根据该Token定位所有日志. 问题:由于目前项目使用Hessian协议,所有Token必须使用Hessian传递.查阅相关资料,发现可以请求头传递数据. 解决方法:定义与线程相关的请求头上下文,在客户端发送请求之前,增加请求头.服务端获取请求时,从请求中解决请求头,并放入请求头上下文中,供服务端使用. 实现