爬虫遇到base64编码(非常规版)

一.特征

从 Base64 的核心特性入手,比如它的编码原理(将二进制数据转换为 ASCII 字符集)和字符集的组成(A-Z、a-z、0-9、+、/ 和 =)。这是 Base64 最基础的特点,几乎每个回答都应该包括这些内容。基于 64 个字符 :Base64 使用 64 个可打印的 ASCII 字符(包括大小写英文字母、数字以及 “+” 和 “/”)来表示二进制数据。这 64 个字符可以组合成各种序列,从而表示任意的二进制数据。长度被四整除,不够被四整除后补零。

一.常规版base64加解密,直接编码即可

python实现

import base64def base64_encode(input_string):# 将字符串转换为字节input_bytes = input_string.encode('utf-8')# 进行 Base64 编码encoded_bytes = base64.b64encode(input_bytes)# 将结果转换为字符串encoded_string = encoded_bytes.decode('utf-8')return encoded_stringinput_string = "Hello, World!"
encoded_string = base64_encode(input_string)
print(f"Base64 Encoded: {encoded_string}")
def base64_decode(encoded_string):# 将字符串转换为字节encoded_bytes = encoded_string.encode('utf-8')# 进行 Base64 解码decoded_bytes = base64.b64decode(encoded_bytes)# 将结果转换为字符串decoded_string = decoded_bytes.decode('utf-8')return decoded_string# 示例
decoded_string = base64_decode(encoded_string)
print(f"Base64 Decoded: {decoded_string}")

爬虫遇到不规范base64,有的还需要映射值。今天总结两种不规范base64解码。

2.映射值

有一次提取一个网站详情,采购供应商门户翻页加解密出来了,接口为

https://ebuy.spdb.com.cn/app/noticeManagement/findSupplierCollect

这个网站可以当作爬虫逆向练习的网站,挺好的

但响应加密,解密出来还有密文我推断是base64加密(有+号,\号,末尾还要=号)

后面解密出来的密文是详情,我用常规base64解出来 ,直接报这个错误

后面查了网页JS代码,接口在

https://ebuy.spdb.com.cn/assets/Base64-2f4ca03a.js

发现个映射值 

创建映射表

    def decode_custom_b64(self, enc_str):custom_b64 = "RSTUVWXYZaDEFGHIJKLMNOPQklmnopqrstuvwxyzbc45678defghijABC01239+/="std_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="# 创建转换映射表trans_table = str.maketrans(custom_b64, std_b64)# 转换到标准Base64std_str = enc_str.translate(trans_table)# 标准Base64解码decoded_bytes = base64.b64decode(std_str)# UTF-8解码return decoded_bytes.decode('utf-8')

 完整案例:

import requests
import subprocess
from functools import partial
import base64subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
def get_js_code():return '''var CryptoJS =require('crypto-js')function vr(F) {const z = CryptoJS.enc.Utf8.parse(F);if (z.sigBytes < 16) {const d = Q.lib.WordArray.random(16 - z.sigBytes);z.concat(d), z.sigBytes = 16} else z.sigBytes > 16 && (z.sigBytes = 16, z.words = z.words.slice(0, 4));return z
}function Bx(F, z) {let d = z + "39457352";return CryptoJS.AES.decrypt(F, vr(d), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)
}
d = {"page": 1, "rows": 10, "startDate": "", "endDate": "", "noticeStatus": 9, "validFlag": 1, "orderRule": 1
}function iv2(e = 8) {for (var t = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"], n = "", l = 0; l < e; l++) {var i = Math.ceil(Math.random() * 35);n += t[i]}return n
}function Ce(F) {let z = {uuid: iv2(16), userId: ""}, d = "nppszdcfw339457352";return {visa: CryptoJS.AES.encrypt(JSON.stringify(z), vr(d), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7}).toString(), params: F}
}f = "/noticeManagement/findPurchaseNotice"function pe(F, z) {return F && true ? false ? lx(F) : Ce(F) : {visa: "", params: F}
}function get_data(encode, f) {txt = JSON.parse(Bx(encode, f))return txt
}function get_headers(d,f) {f = "/noticeManagement/findPurchaseNotice"return pe(d, f)['visa']
}d = {"page": 1, "rows": 10, "startDate": "", "endDate": "", "noticeStatus": 9, "validFlag": 1, "orderRule": 1
}'''
import requests
import execjsheaders = {"Accept": "application/json, text/plain, */*","Accept-Language": "zh-CN,zh;q=0.9","Authorization": "null","Cache-Control": "no-cache","Connection": "keep-alive","Content-Type": "application/x-www-form-urlencoded;charset:utf-8","Content-Visa": "qsNpoek2BvNXOt353QRp7BsZ6/OchE6IkSFG/UK+nKiXWqgzyVBe3+pZjB7+YsME","Origin": "https://ebuy.spdb.com.cn","Pragma": "no-cache","Referer": "https://ebuy.spdb.com.cn/","Sec-Fetch-Dest": "empty","Sec-Fetch-Mode": "cors","Sec-Fetch-Site": "same-origin","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36","X-CSRF-TOKEN": "ab9dfd31-fec3-4f26-872f-6650269027a1","sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\""
}
cookies = {"SESSION": "ZjM1NTFkY2MtNjgyZi00NWZhLWIxNTQtNGZlN2FhNjEzNDA3"
}
url = "https://ebuy.spdb.com.cn/app/noticeManagement/findSupplierCollect"
data = {"page": "2","rows": "10","noticeType": "00100010","startDate": "","endDate": "","noticeStatus": "9","validFlag": "1","orderRule": "1"
}
response = requests.post(url, headers=headers, cookies=cookies, data=data)
url = "https://ebuy.spdb.com.cn/app/csrf/getToken"
js = execjs.compile(get_js_code())
response1 = requests.get(url, headers=headers,)
data = js.call('get_data', response1.json()['data'], response1.headers['content-visa'])
headers['x-csrf-token'] = data['token']
json_obj = js.call('get_data', response.json()['data'], response.headers['content-visa'])import base64def decode_custom_b64(enc_str):custom_b64 = "RSTUVWXYZaDEFGHIJKLMNOPQklmnopqrstuvwxyzbc45678defghijABC01239+/="std_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="# 创建转换映射表trans_table = str.maketrans(custom_b64, std_b64)# 转换到标准Base64std_str = enc_str.translate(trans_table)# 标准Base64解码decoded_bytes = base64.b64decode(std_str)# UTF-8解码return decoded_bytes.decode('utf-8')# 示例
for i in json_obj['rows']:print(i['content'])decoded_string = decode_custom_b64(i['content'])print(decoded_string)

最后结果得出网页源代码

3.转为标准base64.

在工作中要求提取文件链接

https://scut.gzebid.cn/#/noticeDetail?id=cd7f555d3ce78b3f09027ce07a50f6f6&tenderMode=zb&noticeType=8&categoryId=130000

抓包分析,发现数据是加密的 

遇到这个数据很坑,首先|分为两个base64编码,解码为几个json。然后base64没有减号,没有_号,数据里把加号变成减号,把/变为_.要转换过来。base编码长度被四整除,不整除后面补等于号=。真是奇葩的加密数据。而且有些不能被四整除,就很麻烦。

最后详细处理如下,

encoded_str2 = encoded_str.replace('-', '+').replace('_', '/').strip()
# 长度被四整除,不整除后补‘=’
padding_needed = len(encoded_str) % 4
if padding_needed != 0:encoded_str2 += '=' * (4 - padding_needed)
try:decoded_bytes = base64.b64decode(encoded_str2)decoded_str = decoded_bytes.decode('utf-8')json_obj = json.loads(decoded_str)print(json_obj)
except Exception as e:print(e)

完整案例

import requests
import json
import base64
headers = {"Accept": "application/json, text/plain, */*","Accept-Language": "zh-CN,zh;q=0.9","Cache-Control": "no-cache","Connection": "keep-alive","Pragma": "no-cache","Referer": "https://scut.gzebid.cn/","Sec-Fetch-Dest": "empty","Sec-Fetch-Mode": "cors","Sec-Fetch-Site": "same-origin","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36","sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","tenantId": "d2c7335ee6754bdbbc1ad0b9b83207b3"
}
cookies = {"acw_tc": "0a47308517495382118966853e00691d9c985fa1bc61d123ece31e2b39b71c"
}
url = "https://scut.gzebid.cn/api/bid/share/api/platform/articleNew/cd7f555d3ce78b3f09027ce07a50f6f6/zb/8"
response = requests.get(url, headers=headers, cookies=cookies)
encoded_str = response.json()['data']['articles'][0]['files']
# 多个文件,用‘|’分割
encoded_str_list = encoded_str.split('|')
for encoded_str in encoded_str_list:# 转为标准base64编码encoded_str2 = encoded_str.replace('-', '+').replace('_', '/').strip()# 长度被四整除,不整除后补‘=’padding_needed = len(encoded_str) % 4if padding_needed != 0:encoded_str2 += '=' * (4 - padding_needed)try:decoded_bytes = base64.b64decode(encoded_str2)decoded_str = decoded_bytes.decode('utf-8')json_obj = json.loads(decoded_str)print(json_obj)except Exception as e:print(e)

结果如下:

链接,名称,所有数据都出来了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

节拍定时器是什么?

节拍定时器是什么&#xff1f; 节拍定时器&#xff08;SysTick Timer&#xff09;是嵌入式系统中用于提供精确时间基准的核心硬件组件&#xff0c;尤其在ARM Cortex-M系列处理器中广泛应用。以下是其关键特性和应用的综合说明&#xff1a; ⚙️ 一、核心概念与工作原理 硬件基…

SDPA(Scaled Dot-Product Attention)详解

SDPA&#xff08;Scaled Dot-Product Attention&#xff09;详解 SDPA&#xff08;Scaled Dot-Product Attention&#xff0c;缩放点积注意力&#xff09;是 Transformer 模型的核心计算单元&#xff0c;最早由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》提出…

java通过hutool工具生成二维码实现扫码跳转功能

实现&#xff1a; 首先引入zxing和hutool工具依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.google.zxi…

数据库数据导出到Excel表格

1.后端代码 第一步&#xff1a;UserMapper定义根据ID列表批量查询用户方法 // 批量查询用户信息List<User> selectUserByIds(List<Integer> ids); 第二步&#xff1a;UserMapper.xml写动态SQL&#xff0c;实现批量查询用户 <!--根据Ids批量查询用户-->&l…

Altera系列FPGA基于ADV7180解码PAL视频,纯verilog去隔行,提供2套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐我这里已有的PAL视频解码方案 3、设计思路框架工程设计原理框图输入PAL相机ADV7180芯片解读BT656视频解码模块图像缓存架构输出视频格式转…

【教程】Windows安全中心扫描设置排除文件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 解决方法 背景说明 即使已经把实时防护等设置全都关了&#xff0c;但Windows还是会不定时给你扫描&#xff0c;然后把风险软件给删了…

OPenCV CUDA模块立体匹配------对立体匹配生成的视差图进行双边滤波处理类cv::cuda::DisparityBilateralFilter

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::DisparityBilateralFilter 是 OpenCV CUDA 模块中的一个类&#xff0c;用于对立体匹配生成的视差图进行双边滤波处理。这种滤波方法可…

自然语言处理期末复习

自然语言处理期末复习 一单元 自然语言处理基础 两个核心任务&#xff1a; 自然语言理解&#xff08;NLU, Natural Language Understanding&#xff09; 让计算机“读懂”人类语言&#xff0c;理解文本的语义、结构和意图。 典型子任务包括&#xff1a;分词、词性标注、句法分…

黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(上)

引言 2025年6月12日,在巴黎VivaTech大会上,英伟达创始人兼CEO黄仁勋发表了题为"AI工厂驱动的工业革命"的GTC主题演讲。这场持续约1小时35分钟的演讲不仅详细阐述了英伟达在AI基础设施、智能体技术、量子计算及机器人领域的最新突破,更系统性地勾勒出了人工智能如…

DMC-E 系列总线控制卡----雷赛板卡介绍(六)

应用软件开发方法 DMC-E 系列总线运动控制卡的应用软件可以在 Visual Basic 、 Visual C++ 、 C# 等高级语言 环境下开发。应用软件开发之前,需保证 DMC-E 系列总线运动控制卡连接好从站,通过控制 卡 Motion 的 EtherCAT 总线配置界面扫描从站、设置总线通信周期…

题目类型——左右逢源

1、针对的题目&#xff1a;&#xff08;不一定正确或完整&#xff09; 数据结构为数组之类的线性结构&#xff08;也许可以拓展&#xff09;&#xff0c;于是数组中每个元素和其他元素的相对关系为左右或前后需要对数组中每个元素求解或者说最终解要根据每个元素的解得出每个元…

RAG检索前处理

1. 查询构建&#xff08;包括Text2SQL&#xff09; 查询构建的相关技术栈&#xff1a; Text-to-SQLText-to-Cypher 从查询中提取元数据&#xff08;Self-query Retriever&#xff09; 1.1 Text-to-SQL&#xff08;关系数据库&#xff09; 1.1.1 大语言模型方法Text-to-SQL样…

OmoFun动漫官网,动漫共和国最新入口|网页版

OmoFun 动漫&#xff0c;又叫动漫共和国&#xff0c;是一个专注于提供丰富动漫资源的在线平台&#xff0c;深受广大动漫爱好者的喜爱。它汇集了海量的动漫资源&#xff0c;涵盖日本动漫、国产动漫、欧美动漫等多种类型&#xff0c;无论是最新上映的热门番剧还是经典老番&#x…

ue5的blender4.1groom毛发插件v012安装和使用方法(排除了冲突错误)

关键出错不出错是看这个文件pyalembic-1.8.8-cp311-cp311-win_amd64.whl&#xff0c;解决和Alembic SQL工具&#xff09;的加载冲突&#xff01; 其他blender版本根据其内部的python版本选择对应的文件解压安装。 1、安装插件&#xff01;把GroomExporter_v012_Blender4.1.1(原…

windows安装jekyll

windows安装jekyll 安装ruby 首先需要下载ruby RubyInstaller for Windows - RubyInstaller国内镜像站 我的操作系统是win10所以我安装的最新版&#xff0c;你们安装的时候&#xff0c;也可以安装最新版&#xff0c;我这里就不附加图片了 如果你的ruby安装完成之后&#x…

DBever工具自适应mysql不同版本的连接

DBever工具的连接便捷性 最近在使用DBever工具连接不同版本的mysql数据库&#xff0c;发现这个工具确实比mysql-log工具要兼容性好很多&#xff0c;直接就可以连接不同版本的数据库&#xff0c;比如常见的mysql数据库版本&#xff1a;8.0和5.7&#xff0c;而且链接成功后&…

K8S认证|CKS题库+答案| 10. Trivy 扫描镜像安全漏洞

目录 10. Trivy 扫描镜像安全漏洞 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换到master并提权 3&#xff09;、查看Pod和镜像对应关系 4&#xff09;、查看并去重镜像名称 5&#xff09;、扫描所有镜…

Rust高级抽象

Rust 的高级抽象能力是其核心优势之一&#xff0c;允许开发者通过特征&#xff08;Traits&#xff09;、泛型&#xff08;Generics&#xff09;、闭包&#xff08;Closures&#xff09;、迭代器&#xff08;Iterators&#xff09;等机制实现高度灵活和可复用的代码。今天我们来…

Vue里面的映射方法

111.getters配置项 112.mapstate和mapgetter 113.&#xfeff;mapActions与&#xfeff;mapMutations 114.多组件共享数据 115.vuex模块化&#xff0c;namespaces1 116.name&#xfeff;s&#xfeff;pace2

Node.js特训专栏-基础篇:2. JavaScript核心知识在Node.js中的应用

我将从变量、函数、异步编程等方面入手&#xff0c;结合Node.js实际应用场景&#xff0c;为你详细阐述JavaScript核心知识在其中的运用&#xff1a; JavaScript核心知识在Node.js中的应用 在当今的软件开发领域&#xff0c;Node.js凭借其高效的性能和强大的功能&#xff0c;成…