專業Python爬蟲實戰教程:逆向加密接口與驗證碼突破完整案例

案例背景

假設我們需要爬取一家內部測試系統的動態數據API接口。該系統前端頁面使用了復雜的JavaScript混淆技術來防止接口被直接調用,同時對請求參數進行了加密簽名。另外,登錄環節帶有圖形驗證碼用于防護。我們的目標是:

  • 分析JavaScript代碼,逆向加密簽名算法。
  • 模擬登錄過程,自動識別圖形驗證碼并提交。
  • 構造正確請求參數,獲取動態數據。
  • 完整實現Python爬蟲,穩定批量抓取數據。

環境準備

  • Python 3.8+
  • 主要依賴庫:
    • requests (HTTP請求)
    • execjs (調用JavaScript引擎)
    • Pillow & pytesseract(驗證碼圖像處理與OCR)
    • jsbeautifier(JS格式化輔助閱讀)
    • lxml(HTML解析)
    • selenium & webdriver-manager(動態交互及驗證碼抓取,可選)

Step 1:分析網頁結構和JavaScript代碼

模擬環境下,打開前端頁面,按F12打開開發者工具:

  • 頁面HTML框架簡單,核心數據通過POST提交參數調用?/api/v1/getData?接口,返回JSON。
  • POST請求中的參數均為加密后的簽名串,且請求頭帶有特殊字段?X-Custom-Token
  • 登錄頁帶有斷碼的圖形驗證碼,圖片URL是?/captcha/image,驗證碼刷新時參數帶時間戳。

1.1 網絡數據初探

使用Chrome Network面板,關注XHR請求:

POST https://internal.test/api/v1/getData
Request Payload:
{"param": "EncryptedStringHere","sign": "GeneratedSignature"
}
Response:
{"code": 0,"data": [ ... ]
}

1.2 找到加密簽名函數

通過Sources面板,加載執行的JS文件(例如main.min.js,經過混淆壓縮),使用jsbeautifier進行格式化,定位請求相關代碼片段。

逆向發現關鍵函數generateSign(params)

function generateSign(params) {var a = btoa(encodeURIComponent(JSON.stringify(params)));var b = someObfuscatedFunction(a);return md5(b + secretKey);
}

大致邏輯是:

  • 將參數JSON字符串化,編碼成URI,再做Base64編碼。
  • 經過部分混淆函數處理(someObfuscatedFunction)。
  • 最后加上固定密鑰用MD5加密。

Step 2:JavaScript逆向與關鍵代碼還原

2.1 還原混淆函數

原始混淆函數結構類似:

function someObfuscatedFunction(str) {var res = '';for (var i = 0; i < str.length; i++) {res += String.fromCharCode(str.charCodeAt(i) ^ 123); // 按位異或123}return res;
}

這是典型的異或加密,解密時再次異或同樣的數字即可還原。

2.2 Python實現等效簽名函數

利用Python的base64hashlib和自定義異或函數實現:

import base64
import hashlib
import urllib.parsesecret_key = 'FixedSecretKey123'  # 從JS中提取的密鑰def xor_str(s, key=123):return ''.join(chr(ord(c) ^ key) for c in s)def generate_sign(params):# JSON序列化import jsonparam_str = json.dumps(params, separators=(',', ':'), ensure_ascii=False)# URI編碼encoded = urllib.parse.quote(param_str)# Base64編碼b64 = base64.b64encode(encoded.encode('utf-8')).decode('utf-8')# 異或處理xor_result = xor_str(b64)# 計算MD5簽名sign_str = xor_result + secret_keymd5_hash = hashlib.md5(sign_str.encode('utf-8')).hexdigest()return md5_hash

Step 3:驗證碼識別技術

3.1 獲取驗證碼圖片

驗證碼在登錄過程中返回,URL例子:

https://internal.test/captcha/image?_t=時間戳

3.2 圖片預處理與OCR識別

驗證碼為簡單斷碼數字。使用Pillow處理,pytesseract識別。

示例預處理代碼:

from PIL import Image, ImageFilter
import pytesseract
import io
import requestsdef get_captcha(session):url = f'https://internal.test/captcha/image?_t={int(time.time()*1000)}'response = session.get(url)img = Image.open(io.BytesIO(response.content))# 灰度化img = img.convert('L')# 二值化img = img.point(lambda x: 0 if x < 140 else 255, '1')# 去噪img = img.filter(ImageFilter.MedianFilter())return imgdef recognize_captcha(img):text = pytesseract.image_to_string(img, config='--psm 7 digits')text = text.strip().replace(' ', '')return text

Step 4:登錄流程模擬

登錄時需提交用戶名、密碼、驗證碼。

def login(session, username, password):# 獲取驗證碼并識別captcha_img = get_captcha(session)captcha_text = recognize_captcha(captcha_img)login_data = {'username': username,'password': password,'captcha': captcha_text,}response = session.post('https://internal.test/api/login', data=login_data)result = response.json()if result['code'] == 0:print('登錄成功')else:print('登錄失敗:', result['msg'])raise Exception('登錄失敗')

Step 5:核心數據接口調用

構造請求參數,調用數據接口:

def fetch_data(session, params):sign = generate_sign(params)post_data = {'param': params,    # 通常是原始參數JSON對象,部分實現會轉換為字符串,請按實際情況調整'sign': sign,}headers = {'X-Custom-Token': 'token-from-cookie-or-js', # 需要通過登錄等動態獲取'Content-Type': 'application/json',}resp = session.post('https://internal.test/api/v1/getData', json=post_data, headers=headers)data = resp.json()if data['code'] == 0:return data['data']else:raise Exception(f"接口調用失敗: {data['msg']}")

Step 6:整體爬蟲流程整合

import requests
import timedef main():session = requests.Session()# 登錄login(session, 'test_user', 'test_password')# 偽裝UA頭session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'})# 請求示例參數params = {'type': 'recent', 'limit': 20, 'timestamp': int(time.time())}# 調用接口data = fetch_data(session, params)print('獲取數據:', data)if __name__ == '__main__':main()

總結

本案例通過模擬環境設計,綜合講述了下一些高級Python爬蟲技術:

  • JavaScript逆向:理解并還原混淆及加密算法核心。
  • 簽名構造:使用Python重現JS簽名邏輯,成功通過接口認證。
  • 圖形驗證碼識別:圖像預處理加OCR,自動突破登錄驗證。
  • 會話管理:使用requests.Session維護登錄態。
  • 爬蟲實戰:整合流程實現自動登錄、數據抓取的完整爬蟲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91025.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SQL】Windows MySQL 服務查詢啟動停止自啟動(保姆級)

MySQL是一種開放源代碼的輕量級關系型數據庫管理系統&#xff0c;使用最常用的結構化查詢語言&#xff08;SQL&#xff09;對數據庫進行管理。由于MySQL具有體積小、速度快、成本低、開放源碼等優點&#xff0c;現已被廣泛應用于互聯網上的中小型網站中&#xff0c;并且大型網站…

算法提升之數論(矩陣+快速冪)

通過矩陣和快速冪的方法來解決算法題目可以很好地降低時間復雜度&#xff0c;幫助大家更好地解決題目。下面這道題目有一定難度&#xff0c;希望大家可以好好地理解&#xff0c;相信對大家會有很大的幫助。問題描述有 n(2≤n≤10) 個玩家玩游戲&#xff0c;他們按 1 到 n 編號。…

數學建模算法-day[14]

6.2 傳染病預測問題 問題提出 世界上存在很多傳染病&#xff0c;如何根據其傳播機理預測疾病得傳染范圍及染病人數等&#xff0c;對傳染病的控制意義十分重大。 1.指數傳播模型 基本假設 (1) 所研究的區域是一封閉區域&#xff0c;在一個時期內人口總量相對穩定&#xff0c;不考…

Linux救援模式之簡介篇

什么是救援模式&#xff1f;救援模式提供了一個最小的Linux環境&#xff0c;通常只加載最基本的系統組件&#xff0c;允許管理員&#xff1a;修復損壞的系統恢復丟失的文件修改配置文件重置密碼檢查磁盤錯誤重新安裝引導加載程序如何進入救援模式&#xff1f;1. 通過GRUB菜單進…

C++20實戰FlamingoIM開發

C++20 與 Flamingo IM 實例 C++20 引入了許多新特性,如概念(Concepts)、協程(Coroutines)、范圍(Ranges)等。Flamingo IM 是一個即時通訊項目,結合 C++20 的特性可以提升代碼的可讀性和性能。以下是基于 C++20 和 Flamingo IM 的實例。 協程實現異步網絡通信 使用 C…

FPGA實現SRIO高速接口與DSP交互,FPGA+DSP異構方案,提供3套工程源碼和技術支持

目錄1、前言&#xff1a;SRIO在FPGADSP架構中的作用工程概述免責聲明2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的FPGADSP異構方案我這里已有的 GT 高速接口解決方案3、工程詳細設計方案工程設計原理框圖FPGA端工程源碼FPGA端SRIO從…

記一次導出pdf表單引發的問題

需求&#xff1a;點擊按鈕&#xff0c;將相關內容生成pdf下載下來問題1&#xff1a;之前項目封裝好的下載文件方法不攜帶token 我嘗試新寫了一個方法&#xff0c;攜帶token問題2&#xff1a;此時出現了跨域問題 我分別嘗試在controller類上和方法上加CrossOrigin(origins “*”…

AI-調查研究-39-多模態大模型量化 微調與量化如何協同最大化性能與效率?

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-30-新發布【1T 萬億】參數量大模型&#xff01;Kim…

基于Dify構建本地化知識庫智能體:從0到1的實踐指南

技術選型與方案設計 在企業級AI應用落地中&#xff0c;本地化知識庫智能體已成為提升業務效率的核心工具。Dify作為低代碼AI應用開發平臺&#xff0c;結合RAG&#xff08;檢索增強生成&#xff09;技術&#xff0c;可快速構建私有化智能問答系統。以下是關鍵技術選型與架構設計…

C++與C#實戰:FFmpeg屏幕錄制開發指南

基于FFmpeg使用C#和C++開發 以下是一些基于FFmpeg使用C#和C++開發的簡單屏幕錄制軟件示例,涵蓋不同平臺和功能需求。這些示例可作為學習或項目開發的起點。 使用C++開發FFmpeg屏幕錄制 基礎屏幕錄制(Windows) #include <libavcodec/avcodec.h> #include <libav…

「源力覺醒 創作者計劃」_DeepseekVS文心一言代碼簡單測試

一起來輕松玩轉文心大模型吧一文心大模型免費下載地址&#xff1a;https://ai.gitcode.com/theme/1939325484087291906小插曲發現自己的上一篇文章的被盜了&#xff0c;而且是在deepseek上檢索資料發現的&#xff0c;最讓我破防的點在于&#xff0c;它完完全全搬運我的文章&…

服務器數據恢復—RAID上層部署的oracle數據庫數據恢復案例

服務器數據恢復環境&故障&#xff1a; 某公司一臺服務器上有一組由24塊FC硬盤組建的raid。 服務器出現故障&#xff0c;無法正常工作。 經過初步檢測&#xff0c;管理員發現導致服務器故障的原因是raid中有兩塊硬盤掉線&#xff0c;導致卷無法掛載。服務器數據恢復過程&…

鏈表迭代翻轉|二分|狀態壓縮bfs|數學

&#x1f36d;lc2039.bfs空閑時間把網絡抽象成圖&#xff0c;用 BFS 算出 0 號節點到各節點的最短距離 d 。結合每個節點發消息的間隔 patience[v] &#xff0c;先算消息往返需要 2d 秒。再看 2d 和 patience[v] 的關系若 2d 能被 patience[v] 整除&#xff0c;最后一條消息已發…

Vulnhub 02-Breakout靶機滲透攻略詳解

一、下載靶機 下載地址&#xff1a;https://download.vulnhub.com/empire/02-Breakout.zip 下載好后使用VM打開&#xff0c;將網絡配置模式改為net&#xff0c;防止橋接其他主機干擾&#xff08;橋接Mac地址也可確定主機&#xff09;。 二、發現主機 使用nmap掃描沒有相應的…

數據結構(5)單鏈表算法題(中)

一、合并兩個有序鏈表 1、題目描述 https://leetcode.cn/problems/merge-two-sorted-lists 2、算法分析 這道題和之前的合并兩個有序數組的思路很像&#xff0c;創建空鏈表即可&#xff0c;可以很輕松地寫出如下代碼。 /*** Definition for singly-linked list.* struct L…

園區網絡搭建實驗

跟著B站上的老師&#xff0c;用華為ensp模擬搭建了一個園區網絡&#xff0c;感覺挺好玩的雖然老師說這個很簡單&#xff0c;但還是比我公司里的拓撲復雜LSW3配置上行端口3/4配置為串口&#xff0c;下行端口1/2為access口用于連接終端[Huawei]vlan batch 10 20 --創建vlan [Hua…

【tips】小程序css ?號樣式

上傳的時候一般頁面顯示的是加號。不用圖片可以用樣式實現&#xff1b;wxss&#xff1a; /* 加號 */ .plus-box {width: 91rpx;height: 91rpx;border-radius: 6rpx;background: rgba(204, 204, 204, 1);position: relative; /* 用于定位加號 */ }/* 水平線條 */ .plus-box::bef…

MCU中的GPIO(通用輸入/輸出)是什么?

MCU中的GPIO(通用輸入/輸出)是什么? GPIO(General-Purpose Input/Output,通用輸入/輸出)是微控制器(MCU)或嵌入式系統中的一種可編程數字接口,用于與外部設備進行簡單的高低電平信號交互。它是最基礎、最常用的外設之一,廣泛應用于按鍵檢測、LED控制、傳感器通信等場…

echarts 之 datazoom Y軸縮放

如果想 y 軸也能夠縮放&#xff0c;那么在 y 軸上也加上 dataZoom 組件const dataZoomY ref([{type: "slider",yAxisIndex: 0,startValue: 0,endValue: 9,filterMode: "empty",width: 10,height: "80%",showDataShadow: false,left: 5,},{type:…

(四)Python基礎入門-核心數據結構

概覽 列表操作&#xff08;增刪改查/切片/推導式&#xff09;元組特性與不可變性字典操作&#xff08;鍵值對/嵌套字典&#xff09;集合運算&#xff08;交集/并集/差集&#xff09; Python的核心數據結構是編程的基石&#xff0c;本文將系統講解列表、元組、字典和集合四大數…