2020春节 python 爬虫有道词典 心得 (非delete_o 法)

首先我想表达一下,我对奋战在前线的英雄们的感激。
我们一定会很快度过这次疫情的

我春节实在是无聊极了,所以我就点开,小甲鱼的python课。
然后看到很多人说不行,要不就 delete_o 法 就是把request url 中的_o去掉就可以无视他的反爬虫机制
然后我就比较头铁,我头真的很铁,我一米7的身高,非要跟一米八八的争顶

昨天阿森纳4:0 我开心爆了。
萨卡牛逼,扎卡够猛。佩佩终于发挥他8000万的身价了,爱他。
奥巴梅杨牛皮
然后我超爱拉卡泽特,他做的球,狗都能进,属实牛逼!
在这里再死一次厄狗
这是我第一次发帖,我就很机车,废话就很多。

我实在不想委屈求全,所以出现了这个教程
不废话,下面干货

首先我找了一个2018的博客:
https://blog.csdn.net/li939891142/article/details/84592442
首先在这里感谢一下他
但现在他的代码已经失效

按照前辈的方法论,我们现在行不通了,就应该去找有道的js加密方法,于是我们找到
http://fanyi.youdao.com/ 
进去后按F12,找到elem块,找到js
如图

2020春节 python 爬虫有道词典 心得 (非delete_o 法)_第1张图片
点进去后我们发现是一堆代码,根本不能看,我们就需要工具来处理一下js代码,我们百度一下js代码格式化
然后保存在word文档中,搜索salt
如图:
2020春节 python 爬虫有道词典 心得 (非delete_o 法)_第2张图片
我们需要开始对比了:
首先这个sign一看就很不一样,第四个参数的字符串明显改动了。
然后salt的生成方式也变了
多了bv和ts
知道这些后,我们把这些参数伪造出来,骗服务器我们是正常人就行了
最后会附上代码

我这边提一下这个bv
var t = n.md5(navigator.appVersion),
这个t也就是bv了。

对了,这个对应关系从
		return {
	            ts: r,
	            bv: t,
	            salt: i,
	            sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")
	        }
这里看出。

我不懂怎么让python返回服务器的appversion,所以我直接用js(按f12)
然后如图:

2020春节 python 爬虫有道词典 心得 (非delete_o 法)_第3张图片

我代码是直接把这一串字符给copy上去的
莫笑
接下来是我修改后变丑的代码


def getSalt():
    """
    这是计算salt的公式  "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
    把它翻译成Python代码
    :return:
    """
    import time,random
    # (new Date).getTime()生成的时间戳与time.time()的单位不一致,所以需要乘1000
    r= '' + str(str(int(time.time()*1000)))
    salt = r + str(random.randint(0,10))

    return salt

def getMd5(v):
    import hashlib
    md5 = hashlib.md5()

    # 需要一个bytes格式的参数
    md5.update(v.encode("utf-8"))
    sign = md5.hexdigest()

    return sign



def getSign(key, salt):
    sign = "fanyideskweb" + key + str(salt) + "n%A-rKaT5fb[Gy?;N5@Tj"
    sign = getMd5(sign)
    return sign

def getbv():
    appVersion='5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
    bv = getMd5(appVersion)
    return bv

def getts():
    import time, random
    # (new Date).getTime()生成的时间戳与time.time()的单位不一致,所以需要乘1000
    r = '' + str(str(int(time.time() * 1000)))
    return r


from urllib import request,parse

def youdao(key):

    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
    salt = getSalt()
    data = {
        "i": key,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": str(salt),
        "sign": getSign(key, salt),
        'ts' : getts(),
        'bv' : getbv(),
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action": "FY_BY_CLICKBUTTION",
    }
    print(data)
    # 参数data需要是bytes格式
    data = parse.urlencode(data).encode('utf-8')
    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": len(data),
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "Cookie": "[email protected];JSESSIONID=aaaZ6s5m9DVmYf8g3QoDw;OUTFOX_SEARCH_USER_ID_NCOO=473292646.5080033;___rl__test__cookies=1543228484656",
        "Host": "fanyi.youdao.com",
        "Origin":"http://fanyi.youdao.com",
        "Referer":"http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36OPR/56.0.3051.104X-Requested-With:XMLHttpRequest"
    }

    req = request.Request(url=url, data=data, headers=headers)
    rsp = request.urlopen(req)
    html = rsp.read().decode('utf-8')
    # for values in html["translateResult"]:
    #     print(values)

    print(html)

if __name__ == '__main__':
    youdao("girl")
	#     参考:https://blog.csdn.net/li939891142/article/details/84592442博主 感谢他

我最后附上一下结果:
在这里插入图片描述

你可能感兴趣的:(2020春节 python 爬虫有道词典 心得 (非delete_o 法))