-SSL证书就是指遵守SSL安全套阶层协议的服务器数字证书(SercureSocketLayer)
-美国王景公司开发
-CA(CertifacateAuthority)是数字证书认证中心,是发放、管理、废除数字证书的收信人的第三方机构
-遇到不信任的SSL证书,需要单独处理
解决以下错误:
错误1:AttributeError: 'module' object has no attribute '_create_unverified_context',
错误2:URLError:
from urllib import request
#本来是要把不安全的证书改为SSL安全的,但是我用的360浏览器打开是安全的,
#假装当不安全实例改改,遇到不安全的可以用
#导入python ssl处理模块
import ssl
#利用非认证上下文环境替换认证的上下文环境,添加此句可忽略不安全证书信息
ssl._create_default_https_context = ssl._create_unverified_context()
url = "https://www.12306.cn/mormhweb"
rsp = request.urlopen(url)
html = rsp.read().decode()
print(html)
-有的反爬虫策略采用js对需要传输的数据进行加密处理(通常是取md5值)
-经过加密、传输的就是密文,但是
-加密函数或者过程一定是在浏览器完成,也就是会把代码(js代码)暴露给使用者
-通过阅读加密算法,就可以模拟出加密过程,从而达到破解
(1)有道词典在线翻译页面:http://fanyi.youdao.com/?keyfrom=fanyi.logo
(2)例如查询girl,打开审查元素(一般F12键),查看network->all,找到对应页面,点击headers查看有关信息,动态刷新,编写文件如下:
'''
破解有道词典 v1
'''
from urllib import request,parse
def youdao(key):
dc = input("请输入所要翻译的语句:")
url = "http://fanyi.youdao.com/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':'[email protected]; JSESSIONID=aaa9f1yLaywqDfIVlxgOw; OUTFOX_SEARCH_USER_ID_NCOO=228140715.63433138; ___rl__test__cookies=1554885721865',
'Host':'fanyi.youdao.com',
'Origin':'http://fanyi.youdao.com',
'Referer':'http://fanyi.youdao.com/?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里面的文件复制保存下来,我们看到这里是很长的无格式的一段代码,推荐一个工具http://tool.oschina.net/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,random
salt = int(time.time()*1000) + random.randint(0,10)
return salt
#v代表得到的每个md5值
def getMD5(v):
import hashlib
md5 = 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 sign
def getSign(key,salt):
sign = "fanyideskweb" + key + str(salt)+ "@6f#X3=cCuncYssPsuRUE"
sign = getMD5(sign)
return sign
from urllib import request,parse
def youdao(key):
url = "http://fanyi.youdao.com/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':'[email protected]; JSESSIONID=aaa9f1yLaywqDfIVlxgOw; OUTFOX_SEARCH_USER_ID_NCOO=228140715.63433138; ___rl__test__cookies=1554885721865',
'Host':'fanyi.youdao.com',
'Origin':'http://fanyi.youdao.com',
'Referer':'http://fanyi.youdao.com/?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)