首页 > 技术文章 > Python3学习笔记7: requests 、execjs SM4加密爬虫编写

WSPWindAndSunshine 2021-07-30 10:24 原文

学习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

未完待续。。。。。

推荐阅读