君子藏器于身,待时而动~

爬虫-有道翻译

记录一次Python的有道翻译爬虫。

抓包

首先进入有道的网址,打开F12调试工具。
然后随便输入一个词获取翻译。

请求的网址是:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
并且携带了一下参数。

其中关注的参数有如下:

  • i:要翻译的词
  • salt:时间戳
  • sign:签名

由于sign是MD5加密过的,使用要找到他的加密信息。

通过全文本搜索,发现sign相关的加密方法位于fanyi.min.js中。
所幸,这段js没有加密,我们可以格式化一下js然后查找它的方法,获取到加密的方法。

我们可以发现,他加密的字段一共有四个,其中两个是常量,以及两个变量。

从这段代码我们可以看出,参数i是当前的时间戳加上一个随机数生成的。
然后参数e也就是我们要翻译的词。
左边的那段常量是一个固定的,右边的那段常量应该是为了防止伪造请求而添加的一段随机字符串。
我查询过以前其他作者的文章,发现他们的博文中的这串字符串不一样,所以应该这东西是会变化的。
所幸我们可以通过获取js的内容并通过正则表达式获取到这一段内容。
最后将这些拼接起来作为sign参数Post上去,就能获取到对应的翻译了。

代码

注意一下Python的缩进

import requests
import json
import time
import random
import hashlib
import re
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
# 从js中提取md5加密字符串
jsurl = "http://shared.ydstatic.com/fanyi/newweb/v1.0.27/scripts/newweb/fanyi.min.js"
jsContent = str(requests.post(url=jsurl).content,"utf8")
# 替换+
jsContent = jsContent.replace("+","")
password = re.findall(r'"fanyideskweb"ei"(.*?)"',jsContent)
word = input("输入翻译词:")
while(word != "#"):
    # 获取时间戳 + 0-10随机数
    timestamp = str(int(time.time()*1000) + random.randint(0,10))
    # MD5加密sign
    sign = "fanyideskweb" + word +  timestamp + password[0]
    md5 = hashlib.md5()
    md5.update(sign.encode("utf8"))
    signMd5 = md5.hexdigest()
    # 构造请求body
    formatData = {
        "i": word,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": str(timestamp),
        "sign": signMd5,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_REALTlME",
    }
    # 构造请求头
    headers = {
    # 必要信息:Cookie,Host,Origin,Referer,User-Agent
        "Cookie": "OUTFOX_SEARCH_USER_ID=1354776506@10.108.160.101; JSESSIONID=aaaVuQquabmk44VgVY3kx; OUTFOX_SEARCH_USER_ID_NCOO=1742625287.947354; ___rl__test__cookies=1592221619433",
        "Host": "fanyi.youdao.com",
        "Origin":"http://fanyi.youdao.com",
        "Referer":"http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
        }
    response = requests.post(url=url,data=formatData,headers=headers)
    # 解析JSON
    result = json.loads(str(response.content,"utf8"))
    print("输入的字符为:{}".format(result['translateResult'][0][0]['src']))
    print("结果为:{}".format(result['translateResult'][0][0]['tgt']))
    print("------------")
    word = input("输入翻译词:")


NOTE:文章若无特别说明均为原创文章,如果要转载请保留出处!
#Code
分享