第六节 JavaScript逆向
PYTHON网络爬虫概述
第六节 JavaScript逆向
#以有道翻译为简单例子
第一种:post提交表单
按照post方法可以直接提交表单然后进行json.loads()化输出为dict的python对象得到结果。
第二种:JavaScript逆向(签名验证反爬虫)
简介:签名是根据数据源进行计算或者加密的过程,签名的结果是一个具有唯一性和一致性的字符串,签名结果的特性使得它成为验证数据来源和数据完整性的条件,可以有效的避免服务器端伪造的数据或被篡改的数据当成正常数据处理,目前是后端api的防护方法之一与cookie,uesr-agent,host和referer不同,用于签名验证的信息通常被放在请求的正文发送到服务器中。
适用范围:存在参数的get或者post
实现过程:
第一步:看表单,对比表单
易知,当输入不同的文字时,只有salt,sign,ts和bv发生了改变。
第二步:寻找生成改变表单的JavaScript函数
点击右上角search,进入source页面
格式化进行搜所:点击{}
按步骤一个一个函数进行搜寻:ctrl+f
第一个:salt
找到了执行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表示什么呢?
重要方法:断点调试
在主页面随便输入一个文字或者刷新可以得到如下内容
可以知道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)
'''
完毕
'''
欢迎交流蛤!
下一篇: PHP检查网站是否宕机的方法示例
推荐阅读
-
第六节 JavaScript逆向
-
设置JavaScript自动提示-Eclipse/MyEclipse
-
代码实现打印功能(asp.net+javascript)
-
JavaScript中的.trim()无法在IE中运行
-
如何用JavaScript实现2+2=5? JavaScriptUnicodeUTF8UTF16
-
PHP与JavaScript针对Cookie的读写、交互操作方法详解
-
php+javascript实现的动态显示服务器运行程序进度条功能示例
-
asp.net javascript 文件无刷新上传实例代码第1/2页
-
Javascript C#真正可以交互的DES加解密代码
-
【H5 音乐播放实例】第六节 其他