欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第六节 JavaScript逆向

程序员文章站 2024-03-11 19:43:07
...

PYTHON网络爬虫概述

第六节 JavaScript逆向

#以有道翻译为简单例子
第六节 JavaScript逆向
第一种:post提交表单
按照post方法可以直接提交表单然后进行json.loads()化输出为dict的python对象得到结果。

第二种:JavaScript逆向(签名验证反爬虫)
简介:签名是根据数据源进行计算或者加密的过程,签名的结果是一个具有唯一性和一致性的字符串,签名结果的特性使得它成为验证数据来源和数据完整性的条件,可以有效的避免服务器端伪造的数据或被篡改的数据当成正常数据处理,目前是后端api的防护方法之一与cookie,uesr-agent,host和referer不同,用于签名验证的信息通常被放在请求的正文发送到服务器中。
适用范围:存在参数的get或者post
实现过程:
第一步:看表单,对比表单
第六节 JavaScript逆向
易知,当输入不同的文字时,只有salt,sign,ts和bv发生了改变。

第二步:寻找生成改变表单的JavaScript函数
点击右上角search,进入source页面
格式化进行搜所:点击{}
按步骤一个一个函数进行搜寻:ctrl+f
第一个:salt
第六节 JavaScript逆向
找到了执行salt的函数,
salt:i = r + parseInt(10 * Math.random(), 10),
ts:r = “” + (new Date).getTime(),
bv:t = n.md5(navigator.appVersion)
sign:n.md5(“fanyideskweb” + e + i + “mmbP%A-r6U3Nw(n]BjuEU”)
#这些都是JavaScript语法,如果不知道某些函数是什么意思,复制到console执行
可知r表示的是一个时间戳
t表示的是md5后的ua
i表示一个时间戳加上一个随机整数

而sign中的e表示什么呢?
重要方法:断点调试
第六节 JavaScript逆向
在主页面随便输入一个文字或者刷新可以得到如下内容
第六节 JavaScript逆向
可以知道e表示的是我们输入的要进行翻译的内容

因此,代码如下

'''
**有道翻译
'''
#导入模块
import requests
import hashlib
import random
import time
import json
#输入url
#注意这里的url跟原始的post方法对比来看,这里的url是原始的url,而使用post方法的方法url是我们自己发现反爬虫而改正后的url
# 因此post方法相对来说就有反爬虫了,是很难发现的。
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
#设置请求头,最好全部放进去,增强保险性
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Length': '273',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'aaa@qq.com; OUTFOX_SEARCH_USER_ID_NCOO=932538472.0868483; _ntes_nnid=3b5b50271cca99bd6b5ba981d7e172ed,1594705209259; UM_distinctid=173b36cc4a0473-042af860083474-3323765-e1000-173b36cc4a14c6; JSESSIONID=aaaOTFdJbuKSkfahmQZox; ___rl__test__cookies=1596449150117',
    'Host': 'fanyi.youdao.com',
    'Origin': 'http://fanyi.youdao.com',
    'Pragma': 'no-cache',
    'Referer': 'http://fanyi.youdao.com/'
}
#md5加密函数,后面可用
def md5(value):
    x= hashlib.md5()
    x.update(value.encode('utf-8'))
    return x.hexdigest()
#要进行翻译的内容
e = input('请输入要翻译的内容:')
#salt,sign,ts和bv的**
salt = str(int(time.time() * 1000)) + str(random.randint(0,10))
sign = md5("fanyideskweb" + e + salt + "mmbP%A-r6U3Nw(n]BjuEU")
ts = str(int(time.time() * 1000))
bv = md5('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36')
# post方法要提交的表单
Form_data = {
'i': e,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'ts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'

}
#请求有道翻译
json_str = requests.post(url,headers=headers,data=Form_data)
#把json格式转化为python格式
json_python = json.loads(json_str.text)
#获得翻译后的数据
content = json_python["translateResult"][0][0]["tgt"]
print('翻译结果为:')
print(content)
'''
完毕
'''

欢迎交流蛤!

相关标签: 爬虫 python