1、SSL
-SSL证书就是指遵守SSL安全套阶层协议的服务器数字证书(SercureSocketLayer)
-美国王景公司开发
-CA(CertifacateAuthority)是数字证书认证中心,是发放、管理、废除数字证书的收信人的第三方机构
-遇到不信任的SSL证书,需要单独处理
解决以下错误:
错误1:AttributeError: 'module' object has no attribute '_create_unverified_context',
错误2:URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>
from urllib import request#本来是要把不安全的证书改为SSL安全的,但是我用的360浏览器打开是安全的,#假装当不安全实例改改,遇到不安全的可以用#导入python ssl处理模块import ssl#利用非认证上下文环境替换认证的上下文环境,添加此句可忽略不安全证书信息ssl._create_default_https_context = ssl._create_unverified_context()url = "/mormhweb"rsp = request.urlopen(url)html = rsp.read().decode()print(html)
2、js加密
-有的反爬虫策略采用js对需要传输的数据进行加密处理(通常是取md5值)
-经过加密、传输的就是密文,但是
-加密函数或者过程一定是在浏览器完成,也就是会把代码(js代码)暴露给使用者
-通过阅读加密算法,就可以模拟出加密过程,从而达到破解
3、以破解有道词典加密算法为例:
(1)有道词典在线翻译页面:/?keyfrom=fanyi.logo
(2)例如查询girl,打开审查元素(一般F12键),查看network->all,找到对应页面,点击headers查看有关信息,动态刷新,编写文件如下:
'''破解有道词典 v1'''from urllib import request,parsedef youdao(key):dc = input("请输入所要翻译的语句:")url = "/translate_o?smartresult=dict&smartresult=rule"data = {'i':dc,'from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':'15548857218744','sign':"d7a8cf6acc9f4c2f0024b95dd55ae319",'ts':'1554885721874','bv':'bbb3ed55971873051bc2ff740579bb49','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTlME'}data = parse.urlencode(data).encode()headers = {'Accept':'application/json, text/javascript, */*; q=0.01',#'Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9','Connection':'keep-alive','Content-Length':'237','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','Cookie':'OUTFOX_SEARCH_USER_ID=1971107538@10.169.0.82; JSESSIONID=aaa9f1yLaywqDfIVlxgOw; OUTFOX_SEARCH_USER_ID_NCOO=228140715.63433138; ___rl__test__cookies=1554885721865','Host':'','Origin':'','Referer':'/?keyfrom=fanyi.logo','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-with':"XMLHttpRequest"}req = request.Request(url=url,data=data,headers=headers)rsp = request.urlopen(req)html = rsp.read().decode('utf-8')print(html)if __name__ == '__main__':youdao("girl")
报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
解决:导入gzip解码或者注掉不用gzip
此时查询girl可以,查询其他不行,我们注意到data里面有属性“salt”和“sign”,现在研究一下是否和这个有关。
在network->all下,找到fanyi.min.js文件,查看Response,将response里面的文件复制保存下来,我们看到这里是很长的无格式的一段代码,推荐一个工具/codeformat/js,在这里可以进行代码格式化,这里就不贴图了,保存到文本文件就行。
在文件里查找salt和sign,这个文件里有很多个,但是内容功能都大差不差,举例如下:可以看到他们的计算公式
接下来我们开始用代码模拟他们的方法,进行编写。
在审查元素中console(左图)输入如下,右图为在pycharm终端输入,此时我们得到的时间位数和文件中不一样,差三位具体分析见最终代码,但是可以进行编写转换:
在审查元素console输入如下,我们可以看到这个就是生成随机数。
终极代码:
'''v2 处理js加密代码''''''通过查找,能找到js代码中操作代码1、这个是计算salt的公式:r = "" + (new Date).getTime(),i = r + parseInt(10 * Math.random(), 10);2、sign: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")md5一共需要四个参数,第一个和第四个都是固定值的字符串,第三个是所谓的salt,第二个参数就是输入的要查找的单词'''def getSalt():'''salt公式是:r = "" + (new Date).getTime(),i = r + parseInt(10 * Math.random(), 10);把它翻译成python代码:return:'''import time,randomsalt = int(time.time()*1000) + random.randint(0,10)return salt#v代表得到的每个md5值def getMD5(v):import hashlibmd5 = hashlib.md5()#md5.update(v,encoding='utf-8') TypeError: update() takes no keyword arguments#update需要一个bytes格式的参数md5.update(v.encode('utf-8'))sign = md5.hexdigest()return signdef getSign(key,salt):sign = "fanyideskweb" + key + str(salt)+ "@6f#X3=cCuncYssPsuRUE"sign = getMD5(sign)return signfrom urllib import request,parsedef youdao(key):url = "/translate_o?smartresult=dict&smartresult=rule"#在之前先获取salt,保证之后的每个函数的salt都是同一个salt = getSalt()data = {'i':key,'from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':str(salt),'sign':getSign(key,salt),'ts':'1554885721874','bv':'bbb3ed55971873051bc2ff740579bb49','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTlME'}#print(data)data = parse.urlencode(data).encode()headers = {'Accept':'application/json, text/javascript, */*; q=0.01',#'Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9','Connection':'keep-alive','Content-Length':len(data),'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','Cookie':'OUTFOX_SEARCH_USER_ID=1971107538@10.169.0.82; JSESSIONID=aaa9f1yLaywqDfIVlxgOw; OUTFOX_SEARCH_USER_ID_NCOO=228140715.63433138; ___rl__test__cookies=1554885721865','Host':'','Origin':'','Referer':'/?keyfrom=fanyi.logo','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-with':"XMLHttpRequest"}req = request.Request(url=url,data=data,headers=headers)rsp = request.urlopen(req)html = rsp.read().decode('utf-8')print(html)if __name__ == '__main__':a = input("请输入要翻译的语句:")youdao(a)