使用python实现有道翻译反爬虫的破解

1、实现功能

首先我们需要实现在pycharm中输入每个单词可以直接获取内容

2、实现步骤

首先登陆有道翻译,获取该页的 Requests url(请求的网址(统一资源定位符))    REquest  headers(头部请求内容) Form data(表单数据)

然后开始编写爬虫程序

import requests
keyword = input('请输入要翻译的单词:')
url ='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

headers ={
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1943717867.319528; _ga=GA1.2.1847775097.1555988513; OUTFOX_SEARCH_USER_ID="[email protected]"; JSESSIONID=aaa41HNsw8M6z6VigrxPw; ___rl__test__cookies=1556242344070',
'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/72.0.3626.109 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}



data_dic = {
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': i,
'sign': md5_str,
'ts': r,
'bv': '5933be86204903bb334bf023bf3eb5ed',
'doctype':'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}



response = requests.post(url = url,data = data_dic,headers = headers)
print(response.text)

运行程序之后会发现无法获取数据

3、错误分析

首先有道接口不会变也就是 requests url 不会错,请求头部内容只有请求的内容长短发生变换,其他不变

那么就是表单提交的内容发生了变化

上面三幅图是输入三个不同内容之后产生的表单数据,经过观察发现,只有salt(对应的是当前请求的时间戳)、ts(当前时间戳加一位1到10之间的随机数)、sign(经过哈希加密后的数据)发生了改变,这三者是经过js动态生成的,所以说对应的数据生成形式需要要js中进行分析,然后再用python写出对应生成方式

4、分析js中数据生成方式

找网站的js文件双击打开,复制粘贴后在线格式化,再复制到pycharm里就好了

             

5、在js中找到改变salt,sign,ts的函数

在复制到pycharm后按ctrl+f查找salt。

headers中的数据来源于客户端,目的地是服务器,所以headers中的数据要么是用户输入的值,要么是js自己或根据用户输入产生的动态值,js生成的数据会用变量接收,Form Data中的键名一般会(99.99%)与js中的变量名一致,因为是同一个人开发的这一模块。我们根据salt,sign,ts到js文件中按住ctrl+f查找找就能找到相应的功能函数,找到了就可以发现他们三个键的值是怎么生成的了,我们再用python实现js同样的功能就好了。


6、找到数据来源

在js代码中按ctrl+f查找salt找到下面代码块(可能有多个salt,按照理解分析找到对的地方)。

图中的e是以参数传进来的,我们要找他可以ctrl+f查询谁调用了这个r函数,就能得到参数e是啥了,即:查询r(e)或 = r(  ,没错就是等号和单括号。 我找到的结果是:e就是我们输入的查询单词mode

最后一行给定了两个字符串,并且将e和i放进去一起进行md5加密
 

7、python实现相同逻辑

实现五处动态:

代码实现js相同逻辑

import requests
import time
import random
 
# 生成md5字符串
def getMd5(value):
    import hashlib
    md5 = hashlib.md5()
    md5.update(bytes(value, encoding='Utf-8'))
    md5_str = md5.hexdigest()
    return md5_str
 
if __name__ == '__main__':
    #输入单词
    keyword = input('翻译的单词:')
 
    #生成salt的值
    r = str(int(time.time()*1000))
    salt = r + str(int(random.random()*10))
 
    #生成sign
    value = "fanyideskweb" + keyword + salt + "@6f#X3=cCuncYssPsuRUE"
    md5_str = getMd5(value)
 
    #生成header
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Content-Length': str(233+len(keyword)),
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=6241167.578427844; _ga=GA1.2.1519057173.1535511777; JSESSIONID=aaamFTGK4qLCf4uKcrxPw; ___rl__test__cookies=1556242390777',
        'Host': 'fanyi.youdao.com',
        'Origin': 'http://fanyi.youdao.com',
        'Referer': 'http://fanyi.youdao.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }
 
    #生成表单数据
    data_dic = {
        'i': keyword,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': md5_str,
        'ts': r,
        'bv': 'ae62d2e2541901f6ebf99ec18e429e3f',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }
 
    #接口地址
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    #发起网络请求
    response = requests.post(url=url,data=data_dic,headers=headers)
    print(response.text)

运行结果:

翻译的单词:job
{"translateResult":[[{"tgt":"工作","src":"job"}]],"errorCode":0,"type":"en2zh-CHS","smartResult":{"entries":["","n. 工作;职业\r\n","vt. 承包;代客买卖\r\n","vi. 做零工\r\n"],"type":1}}

猜你喜欢

转载自blog.csdn.net/weixin_44239541/article/details/89576537
今日推荐