爬蟲遇到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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84764.shtml
英文地址,請注明出處:http://en.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;成…