爬取有道翻译的两种做法!开源免费!!!

一、需要用到的工具:
先把格式化js的线上网址记录一下:http://tool.chinaz.com/Tools/jsformat.aspx
二、分析流程、
有道翻译分析过程
(1)翻译过程中会发起请求 response中可以看到响应的结果
(2)Headers最下面,Form Data许多的数据,这些数据就是在点击翻译的时候浏览器给服务器发送的数据
在这里插入图片描述
爬取有道翻译的两种做法!开源免费!!!_第1张图片
(3)
i:需要进行翻译的字符串。
salt:加密用到的盐。这个是我们破解有道反爬虫机制的关键点。
sign:签名字符串。也是破解反爬虫机制的关键点

(4)比较每次翻译时候发送的Form Data的值。我们注意到,Form Data在每次发送网络请求的时候,只有i和salt以及sign这三个是不同的,其他的数据都是一样的
图片: https://uploader.shimo.im/f/Rrk4LH7N164mKRVb.png
爬取有道翻译的两种做法!开源免费!!!_第2张图片

(5)每次发送翻译请求的时候,并没有一个请求是专门用来获取这两个值的:
图片: https://uploader.shimo.im/f/8sTHSUy3lZwLOS8n.png
(6)那就是在本地自己生成的,如果是在本地自己生成的,那么规则是什么呢?这里我们点击网页,查看网页源代码,查找所有的JS文件,我们找到那个fanyi.js:
爬取有道翻译的两种做法!开源免费!!!_第3张图片
根据分析:salt sign 两个值为所需要破解的密钥
话不多说,上代码:

方法1:urllis方法爬取:

import json
from urllib import parse, request
import time,random
import hashlib
md5 = hashlib.md5()

def getSign(key, salt):
    '''
    获取sign
    :param key: 要翻译的字符串
    :param salt: 盐值
    :return:
    '''
    # 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成
    sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
    sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中
    return sign #得到的结果返回

def getmd5(v):
    '''
    :param v: 传递过来写好的sign
    :return:
    '''
    md5.update(v.encode("utf8"))#编码
    sign = md5.hexdigest()#执行加密
    return sign#返回
def fy(i):
    '''
    通过在js文件中查找salt或者sign,可以找到
    1.可以找到这个计算salt的公式
    r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
    2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj");
    md5
    一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt,
    第二个参数是输入的需要翻译的单词
    '''
    req_url="http://fanyi.youdao.com/translate"
    ts = str(int((time.time() * 1000)))#时间戳
    salt = str(ts) + str(random.randint(0, 10))#盐值
    fanyidata = {
        "i":i,                      #要翻译的字符串
        "from":"AUTO",
        "to":"AUTO",
        "smartresult":"dict",
        "client":"fanyideskweb",       #写死的值
        "salt": str(salt),              #盐值
        "sign":getSign(i, salt),        #获取sign
        "ts":ts,                        #时间戳
        "bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值
        "doctype":"json",               #格式
        "version":"2.1",                #版本
        "keyfrom":"fanyi.web",
        "action":"FY_BY_REALTIME",
        "typoResult":"false",
    }
    data=parse.urlencode(fanyidata).encode("utf-8") # 对数据进行编码处理
    response=request.urlopen(req_url,data) #提交数据并解析
    html=response.read().decode("utf-8")# 读取返回来的数据
    print(html) #json格式
    translate_results=json.loads(html)  # 把返回来的json字符串解析成字典
    print("translate_results======",translate_results)
    translate_results=translate_results["translateResult"][0][0]["tgt"]     #翻译后的结果
    print("翻译后的结果",translate_results)
    return translate_results

if __name__=="__main__":
    # 项目入口首先要得到要翻译的字符串,给个输入框来获取
    content = input('请输入需要翻译的句子:')
    d=content
    # 得到以后传给翻译接口
    fy(d)

运行结果:
打印结果

方法2:requests爬取

import json
import requests
import time, random
session = requests.session()
import hashlib
md5 = hashlib.md5()


def getSign(key, salt):
    '''
    获取sign
    :param key: 要翻译的字符串
    :param salt: 盐值
    :return:
    '''
    # 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成
    sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
    sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中
    return sign #得到的结果返回

def getmd5(v):
    '''
    :param v: 传递过来写好的sign
    :return:
    '''
    md5.update(v.encode("utf8"))#编码
    sign = md5.hexdigest()#执行加密
    return sign#返回
def youdao(key):
    '''
    通过在js文件中查找salt或者sign,可以找到
    1.可以找到这个计算salt的公式
    r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
    2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj");
    md5
    一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt,
    第二个参数是输入的需要翻译的单词
    '''
    url = "http://fanyi.youdao.com/translate"
    ts = str(int((time.time() * 1000)))#时间戳
    salt = str(ts) + str(random.randint(0, 10))#盐值
    data = {
        "i":key,                      #要翻译的字符串
        "from":"AUTO",
        "to":"AUTO",
        "smartresult":"dict",
        "client":"fanyideskweb",       #写死的值
        "salt": str(salt),              #盐值
        "sign":getSign(key, salt),        #获取sign
        "ts":ts,                        #时间戳
        "bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值
        "doctype":"json",               #格式
        "version":"2.1",                #版本
        "keyfrom":"fanyi.web",
        "action":"FY_BY_REALTIME",
        "typoResult":"false",
    }
    result =requests.post(url=url, data=data)
    resultdata=result.text#得到文本数据
    # print("resultdata", resultdata)
    translateResult=json.loads(resultdata)# 把返回来的json字符串解析成字典
    print("translateResult======", translateResult)
    translate_results = translateResult["translateResult"][0][0]["tgt"]  # 翻译后的结果
    print("翻译后的结果", translate_results)
if __name__ == '__main__':
    # 项目入口首先要得到要翻译的字符串,给个输入框来获取
    content = input('请输入需要翻译的句子:')
    d=content
    # 得到以后传给翻译接口
    youdao(d)
运行结果:![结果](https://img-blog.csdnimg.cn/20200320200929738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b211d3VodWl4dWU=,size_16,color_FFFFFF,t_70#pic_center)
拿走不谢,对您有帮助请点赞支持,谢谢!

你可能感兴趣的:(爬取有道翻译的两种做法!开源免费!!!)