学习Python3,坚持每一次学习都有一点点知识的积累,瞄准目标gogogo!
由于之前参加了6月底的PMP考试,导致Python3的学习中断了,最近又想趁热打铁把高项拿下,高项的考试比PMP要麻烦得多,学习也是断断续续的。
此次是一个简单的爬取加密数据的爬虫,主要是用到了如下组件(此事就提现到了python的优势,各种组件一键安装,强大、方便、好用):
request
网络请求
execjs
在python中完成JavaScript代码的运行
(由于涉及到SM4的加密,所以在获取到目标网站的加密js之后,想要准确执行还是建议直接把相关代码copy下来,直接执行,免去换语言翻译以及存在误差的问题)
网站爬取要求:
发送的数据请求body要先加密
header中有若干要求,Cookie在header中
返回的数据请求要解密
不说废话,代码(残缺,涉及到目标网站的机密):
加密模块(网站的请求内容,也是需要加密的):
# coding=utf-8
import execjs
import json
from urllib import parse
jscompile = execjs.compile(
"""目标网站上的获得的加密代码"""
, cwd=r"C:\Users\Administrator\node_modules")
class encry_util:
def get_bpurpr_payload(self, token, pubkeyHex):
plainTest = token+'***",\n "token": "'+token+'"\n}'
payload = jscompile.call('sm4Encrypt',plainTest, pubkeyHex) # 解码字符串
# 返回加密字符串
return payload
获取数据模块:
import requests
from spider.decodeutil import decode_util
from spider.makeencrypt import encry_util
url = "https://。。。。。。"
#爬虫必要的主要配置项
Cookie = 'AAA=!DYxHP9+MO9nQwF+wBfj7kQDFO4jKC3sNW0tjBsV0S1oVmhB6OnsorfwO79jQ8o9o8QMOc9SFCEgnaA==; BBB=!dtCJfD39qlw7lmqwBfj7kQDFO4jKCxEstAdr//teNau7Thq0b8FyMepFw/NGdwpnBBb+ZUC5khDhgg==; JSESSIONID=ahsdiasdasdasdnkansdiasdnkasnd'
token = 'asdasdasdasrdqwrqwerqwer'
pubkeyHex = "qweqweqweqwewqewqewqewqe"
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '45454',
'content-type': 'application/json',
'Cookie': Cookie,
'token': token,
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36'
}
#chakan记录
def do_bpurpr():
#发送的请求加密
payload = encry_util.get_payload('null', token, pubkeyHex)
# 请求数据
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#解析请求到的加密数据
js_function = 'function'
dotext = decode_util.deencode('null', js_function, response.text)
print(dotext)
#遍历数据,并调用下一层 按包查看
for obj_dict in dotext:
print("获取到数据")
数据解密(调用js代码):
jscompile = execjs.compile(
"""
"""
)
class decode_util:
def deencode(self,js_function, cipher_text):
print(cipher_text)
deencode_str = parse.unquote(jscompile.call(js_function, cipher_text[1:-1])) # 解码字符串
json_list = json.loads(deencode_str[2:-28])["resultValue"]['items']
# 返回解码字符串
return json_list
未完待续。。。。。