在爬虫过程中,经常给服务器造成压力(比如耗尽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日。不保证代码一直有效。仅供参考学习,请勿用于商业用途上。

最新文章

  1. js 表单验证方法二
  2. 两个list取不同值
  3. Nancy 学习-自宿主 继续跨平台
  4. 网页首页制作总结(div+css+javascript)
  5. druid的安装
  6. vs 异常处理
  7. 在Android项目中调用已有.so库
  8. php基础小知识
  9. ssi整合报错org.apache.struts2.convention.ConventionsServiceImpl.determineResultPath(ConventionsServiceImpl.java:100)
  10. Unix System Overview
  11. SQL Server中CURD语句的锁流程分析
  12. 【持久化框架】Mybatis与Hibernate的详细对比
  13. 断剑重铸之日,席卷朗朗乾坤之时--PHP学习一月漫记
  14. [Paxos] Paxos Made Simple 读后感
  15. 《深入浅出MySQL》之SQL基础
  16. HTML入门8
  17. HDU 1114
  18. linux 释放内存及查看内存命令
  19. keydown,keypress,keyup三者之间的区别
  20. eclipse中 EAR Libraries 是什么?

热门文章

  1. FTP传输协议的应用详解
  2. C#为什么要多线程开发(一)
  3. Codeforces.226D.The table(构造)
  4. IDatabaseInitializer<TContext>接口研究
  5. C++程序设计方法3:派生类对象的构造和析构过程
  6. 爬虫——request
  7. Yii2 DetailView小部件
  8. Egret 获取不到皮肤中的按钮 id
  9. Java中map集合系列原理剖析
  10. 在C#中,Json的序列化和反序列化的几种方式总结 转载