码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-22 21:45:33      阅读:634      评论:0      收藏:0      [点我收藏+]

标签:zh-cn   sessionid   复制   odi   动态   action   you   iges   ted   

 一、静态爬取页面信息

有道翻译网址: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)
View Code

 

二、动态爬取页面信息(加密)

输入测试数据,再通过使用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)
View Code

 

 

 

 

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

标签:zh-cn   sessionid   复制   odi   动态   action   you   iges   ted   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!