爬虫破解js加密(一) 有道词典js加密参数 sign破解
在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术。
常见的反爬虫技术有封ip,user_agent,字体库,js加密,验证码(字符验证码,滑动验证码,点触式验证码等)。所谓魔高一尺道高一丈。有反爬虫,就有反反爬虫技术。本文重要讲js加密的破解方法。
js加密一般是在请求头或者请求参数加入加密有的字段。爬虫开发者不知道加密的方法,就能够抵挡一些低级爬虫工程师。但是js加密函数或者过程一定是在浏览器完成,
也就是一定会把js代码暴露给使用者。通过阅读加密算法,就可以模拟出加密过程,从而达到破解。
js破解的方式有:
一:把js代码翻译成Python或者java等代码。这个对于大部分的爬虫工程师是有难度的。因为爬虫偏向于后端的处理,很少有爬虫工程师去精通前端的知识,还有一点就是经过加密,混要,压缩的js代码阅读性很差的。即使是开发三五年的前端工程师,也很少能看懂的。更何况是没有搞过js的爬虫工程师呢?当然也有一些高手除外。
二: 执行js代码。可以使用Python的一些第三方库比如 pyv8,或者execjs去执行js代码。这个代码效率很高的。
三:使用selenium或者appiun等框架。强烈不建议使用。因为代码的稳定性和效率都很低。
有道词典参数破解分析流程:
第一步:我们在页面输入需要翻译的单词 好人。输出结果是 A good man。请求接口是 url= http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
输入参数如下图所示。

第二部:遇到加密的请求参数,一般是去js代码里面找这个接口。

我们在 http://shared.ydstatic.com/fanyi/newweb/v1.0.15/scripts/newweb/fanyi.min.js文件中找到了 ajax请求接口。

格式化js代码:
找到核心代码如下:

加密过程找sign,如下:

最后一步。Python代码实现加密过程。
代码如下:
# coding:utf-8 # 破解js加密,版本2
'''
通过在js文件中查找salt或者sign,可以找到
1.可以找到这个计算salt的公式
r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
2.sign:n.md5("fanyideskweb" + t + r + "p09@Bn{h02_BIEe]$P^nG");
md5 一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是所谓的salt,
第二个参数是输入的需要翻译的单词
''' import requests
import time, random
import requests
session = requests.session() ts = str(int((time.time()*1000)))
salt = str(ts) + str(random.randint(0, 10)) print ts
print salt def getmd5(v):
import hashlib
md5 = hashlib.md5()
md5.update(v)
sign = md5.hexdigest()
return sign def getSign(key, salt): sign = "fanyideskweb" + str(key) + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
sign = getmd5(sign)
return sign def youdao(key): url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
data = {
"i":key,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt": str(salt),
"sign":getSign(key, salt),
"ts":ts,
"bv":"6074bfcb52fb292f0428cb1dd669cfb8",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false", }
headers = { "Host":"fanyi.youdao.com",
# "Proxy-Connection":"keep-alive",
"Content-Length":len(data),
"Accept":"application/json, text/javascript, */*; q=0.01",
"Origin":"http://fanyi.youdao.com",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Referer":"http://fanyi.youdao.com/",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Cookie":"OUTFOX_SEARCH_USER_ID=119019685@10.168.8.63; JSESSIONID=aaaAioBu8RNDK46QQgoKw; OUTFOX_SEARCH_USER_ID_NCOO=585978009.1173552; UM_distinctid=1690e1aeb4938-0e3d396c4bdd96-551f3c12-100200-1690e1aeb4b7e; ___rl__test__cookies=1550723437154", }
result =requests.post(url=url, data=data, headers=headers)
print result.text if __name__ == '__main__':
youdao("好人")
输出结果:

本博客写于2019年2月21日。不保证代码一直有效。仅供参考学习,请勿用于商业用途上。
爬虫破解js加密(一) 有道词典js加密参数 sign破解的更多相关文章
- python完成加密参数sign计算并输出指定格式的字符串
加密规则: 1.固定加密字符串+字符串组合(key/value的形式,并通过aissc码排序), 2.通过sha1算法对排序后的字符串进行加密, 3.最终输出需要的参数sign 4.完成请求参数数据的 ...
- python爬虫-有道翻译-js加密破解
有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...
- Mac上的欧路词典单词本迁移到有道词典 #node.js
摘要 有道词典提供了柯林斯和朗文辞典,加上最近在背单词且Mac版的屏幕取词也够用了,为了云单词本的同步,决定抛弃Mac上的欧路词典.单词欧路上的单词本也存了一百多个单词.怎样迁移到有道呢? 关键词:n ...
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
1.有道的翻译 网页:www.youdao.com Fig1 Fig2 Fig3 Fig4 再次点击"自动翻译"->选中'Network'->选中'第一项',如下: F ...
- python "爬虫+有道词典"实现一个简单翻译程序
抓包软件使用的是Fiddler4 新版的查询接口 比较负责,引入了salt和sign http://fanyi.youdao.com/translate?smartresult=dict&sm ...
- python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)
一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...
- 【应用】_有道词典客户端一个后缀名为sql的数据库。
[缘起] 在清理电脑磁盘的时候,看一看各安装文件夹有占用了多大容量,发现有道词典居然达140MB了,于是进去看看. 发现个有趣的文件:XXX.sql. 首先我们看一看它的安装文件夹的结构: Dict ...
- 基于pygtk的linux有道词典
基于pygtk的linux有道词典 一.桌面词典设计 想把Linux用作桌面系统,其中一部分障碍就是Linux上没有像有道一样简单易用的词典.其实我们完全可以自己开发一款桌面词典, 而且开发一款桌面词 ...
- 在有道词典程序文件夹发现一个后缀名为sql的数据库(SQLite)
缘起 在清理电脑磁盘的时候,看一看各安装文件夹有占用了多大容量,发现有道词典居然达140MB了,于是进去看看. 发现个有趣的文件:XXX.sql. 首先我们看一看它的安装文件夹的结构: Dict └─ ...
随机推荐
- ZOJ 3795 Grouping (强连通缩点+DP最长路)
<题目链接> 题目大意: n个人,m条关系,每条关系a >= b,说明a,b之间是可比较的,如果还有b >= c,则说明b,c之间,a,c之间都是可以比较的.问至少需要多少个集 ...
- JavaScript 作用域的误区
了解JavaScript的同学可能知道,JavaScript语言由于设计原因,导致语言本身存在很多先天性的不足,当然这并非设计者有意的,js语言最初是被设计来作为网页交互的脚本语言,依照现有的js语法 ...
- Spring:获取容器中的Bean
某些情况下我们要获取 IOC 容器中指定注解.类型.名字的 Bean 要获取 IOC 容器中指定条件的 Bean 可以通过 ApplicationContext 相应的方法 @Autowired pr ...
- 通过Quartz 配置定时调度任务:使用cron表达式配置时间点
Cron官网入口 在后台经常需要一些定时处理的任务,比如微信相关应用所需的access_token,就要定时刷新,官方返回的有效性是7200s,也就是2小时,但是为了保险起见,除了在发现access_ ...
- BZOJ2702 : 金融风暴
求出离每个点最近的关键点,然后用二维ST表回答正方形最大值. 将关键点分为上下两部分,以上为例: 从上到下依次考虑每一行,记录每一列往上最近的关键点的距离,那么最优决策具有单调性,可以分治求解. 时间 ...
- BZOJ1889 : Maximal
二分答案,判断是否存在合法方案使得每个数都不超过$mid$. 考虑网络流建图: $i$点的流量下限为$\max(a_i-mid,0)$,费用为$1$,故拆点进行限制. $i$向$i+1$.$S$向$i ...
- python之item方法
__setitem__ __getitem__ __delitem__这三个函数 是通过字典形式来处理属性 字典形式使用中括号的方式获取值 class Foo: def __init__(sel ...
- ajax冲刺03
---恢复内容开始--- 1.jq中ajax封装 简单的$.ajax方法使用示例:请关注 传参类型及数据 <!DOCTYPE html> <html lang="en&qu ...
- JS自学笔记04
JS自学笔记04 arguments[索引] 实参的值 1.对象 1)创建对象 ①调用系统的构造函数创建对象 var obj=new Object(); //添加属性.对象.名字=值; obj.nam ...
- django之模版层(template)
上篇主要介绍了django的MTV模型,主要介绍了视图层之路由配置系统url分发和视图层之视图函数view,本篇主要讲解MTV模型中的模版层template. 本篇导论: 模版简介 模版之变量 模版之 ...