突破反爬困境:SDK開發,瀏覽器模塊(七)

聲明

本文所討論的內容及技術均純屬學術交流與技術研究目的,旨在探討和總結互聯網數據流動、前后端技術架構及安全防御中的技術演進。文中提及的各類技術手段和策略均僅供技術人員在合法與合規的前提下進行研究、學習與防御測試之用。

作者不支持亦不鼓勵任何未經授權的工程應用或違法行為,所有內容均不構成任何非法操作的技術指導或建議。請各位讀者根據所在平臺的相關規定及法律法規謹慎使用和解讀本文內容。

引言

在過去的六篇文章中,我們以“庖丁解牛”的方式拆解了反爬蟲攻防的核心邏輯,從協議分析、行為特征檢測到動態渲染對抗,逐步構建了一套完整的反爬蟲技術設計框架。

從這一篇開始,一切將截然不同,我們將以代碼說話。

設計是技術的骨架,而開發才是賦予其血肉與靈魂的過程。本文將帶領讀者正式跨越理論與實踐的邊界,進入實戰開發階段。我們將親手實現一個輕量指紋瀏覽器SDK,并深度集成瀏覽器自動化工具(如Puppeteer、Playwright)。

接下來的內容將默認讀者已掌握Python/JavaScript基礎及HTTP協議核心知識。

接口設計

在設計SDK接口時,我反復澄清要給到最終使用者的是什么?更多功能?還是更簡單易用?在這里,我選擇了更加傾向于易用性。畢竟我們的程序,是要解決問題,降低復雜度,而非制造問題。因此我們在設計瀏覽器模塊接口時,只關注以下幾個動作:

  • 創建一個瀏覽器實例
  • 關閉瀏覽器實例,并回收相關資源
  • 查看當前正在運行中的瀏覽器實例

這些行為,已經完全可以滿足一個爬蟲在執行過程中所需進行的全部動作了。因為在瀏覽器實例創建完畢之并與爬蟲框架完成CDP連接之后,后續的就都是爬蟲系統的行為了。

接口文檔

由于我們是指紋瀏覽器,因此我們先把指紋模型的設計放在最開始

指紋數據

{"screen": {"width": 800, // 寬度"height": 600 // 高度},// 屏幕分辨率 非必填"timezone": "Asia/Hong_Kong",// 時區,非必填"userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/86.0.4240.198", // UA信息 非必填"platform": "Win32",// 平臺信息 非必填"userAgentData": {"productName": "Google Chrome", //瀏覽器品牌名 Google Chrome / Microsoft Edge / Chromium / Brave"productVersion": "110.0.5481.78", // 瀏覽器版本號"isMobile": false, // 是否為手機版  "platform": "Windows", // 運行平臺 Windows/Mac OS X/Linux/iOS/Android"platformVersion": "15.0.0", // 運行平臺版本號 Windows 舉例 Win11:15.0.0 /Win10: 10.0.0"architecture": "x86", // 編譯架構 arm/x86"bitness": "64", //運行平臺 位數 32/64"model": "", //品牌型號,僅限手機版情況下有值"wow64": false // 99 以下 undefined,99 以上 false(僅win有判斷,其他系統統一false)},// UAData信息 非必填 但UA發生變化時必填,同時會校驗此信息合法性"deviceMemory?": 8, // 設備內存 非必填"hardwareConcurrency?": 4, // 硬件并發數 非必填"languages": ["en-US",], // 頁面語言 非必填"locale": "en-US", // UI語言 非必填},"font": {"unicode": true, //是否禁用Emoji表情,true|false"fonts": ["Arial","Arial Black","Arial Narrow","Calibri","Cambria","Cambria Math","Comic Sans MS"],// 字體列表}, // 字體信息 非必填"audio": {"seed": "xxxxx"},// 音頻指紋噪聲 非必填"canvas": {"seed": "xxxxx"},// Canvas指紋噪聲 非必填"webgl": { "seed": "xxxxx", // 噪聲 非必填"meta":{"vendor": "Google Inc.", // 提供商"renderer": "ANGLE (NVIDIA GeForce GT 730)" // 渲染器} //元數據 非必填},// WebGL配置 非必填"geolocation": {"latitude": 44.0,"longitude": 55.0},// 定位信息 非必填"bluetooth": { "enabled": false // 是否啟用藍牙,true or false},// 藍牙狀態 非必填"speech": [// 至少有一項的is_default為true !// 否則朗讀者列表強制轉化為空,顯示為blocked{"name": "Microsoft Swara - Hindi (India)", // 朗誦者名稱,字符串"lang": "hi-IN", // 朗誦者語言,字符串"isDefault": true // 是否為默認語音,true or false},{"name": "Microsoft Sylvie - French (Canada)","lang": "fr-CA","isDefault": false}]// 朗讀者列表 非必填}

以上是我們指紋部分支持的全部配置,通過這些指紋的排列組合,我們已經可以很好的確定瀏覽器實例的指紋唯一性了,下面我們來繼續完善其他操作的文檔。

新建瀏覽器實例

API

路徑

請求方式

/browsers

POST

Request
{"userDataDir":"", // 數據緩存路徑 必填"proxy":{"protocol":"http",// 協議 支持http,https,socks 必填"host":"39.123.33.154",// 代理主機 支持 IPv4 IPv6 以及域名  必填"port":10234,// 代理端口  必填"username":"",// 用戶名 非必填"password":"",// 密碼 非必填},//代理 非必填"args":[],// 瀏覽器附加的命令行參數,非必填 會過濾掉 --proxy-server --remote-debugging-port"metadata":{},//用戶存儲的元數據,非必填"fingerprint":{},// 指紋數據,非必填 無指紋數據時則不會對指紋進行模擬。
}
Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 瀏覽器實例ID"proxyUrl":"http://127.0.0.1:11111",// 瀏覽器使用的本地轉發后的代理鏈接"args":[],// 瀏覽器附加的參數"metadata":{},// 用戶緩存的元數據"automation":{"driverPath":"",// 瀏覽器匹配的WebDriver路徑"remoteDebuggingPort":32023,// 遠程調試端口"cdpUrl":"http://127.0.0.1:32023",// CDP連接路徑"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket連接路徑},// 自動化相關信息"createdTime":""// 創建時間
}

關閉瀏覽器實例

API

路徑

請求方式

/browsers/{browserId}

DELETE

Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 瀏覽器實例ID"proxyUrl":"http://127.0.0.1:11111",// 瀏覽器使用的本地轉發后的代理鏈接"args":[],// 瀏覽器附加的參數"metadata":{},// 用戶緩存的元數據"automation":{"driverPath":"",// 瀏覽器匹配的WebDriver路徑"remoteDebuggingPort":32023,// 遠程調試端口"cdpUrl":"http://127.0.0.1:32023",// CDP連接路徑"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket連接路徑},// 自動化相關信息"createdTime":""// 創建時間
}

關閉全部瀏覽器實例

API

路徑

請求方式

/browsers

DELETE

Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 瀏覽器實例ID"proxyUrl":"http://127.0.0.1:11111",// 瀏覽器使用的本地轉發后的代理鏈接"args":[],// 瀏覽器附加的參數"metadata":{},// 用戶緩存的元數據"automation":{"driverPath":"",// 瀏覽器匹配的WebDriver路徑"remoteDebuggingPort":32023,// 遠程調試端口"cdpUrl":"http://127.0.0.1:32023",// CDP連接路徑"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket連接路徑},// 自動化相關信息"createdTime":""// 創建時間
}

查看當前所有正在運行的瀏覽器實例

API

路徑

請求方式

/browsers

GET

Response
[{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 瀏覽器實例ID"proxyUrl":"http://127.0.0.1:11111",// 瀏覽器使用的本地轉發后的代理鏈接"args":[],// 瀏覽器附加的參數"metadata":{},// 用戶緩存的元數據"automation":{"driverPath":"",// 瀏覽器匹配的WebDriver路徑"remoteDebuggingPort":32023,// 遠程調試端口"cdpUrl":"http://127.0.0.1:32023",// CDP連接路徑"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket連接路徑},// 自動化相關信息"createdTime":""// 創建時間
}]

以上就是全部的接口設計文檔了。

使用案例

下面我們以用戶的角度,來使用我們的SDK,以下是一個基于Python與Playwright框架的簡單例子。

import requests
from playwright.sync_api import sync_playwright# API信息
api_url = "http://localhost:3000/browsers"  # 假設這是我們SDK服務的地址# 請求數據
request_data = {"userDataDir": "/path/to/user/data",  # 請替換為實際的數據緩存路徑"proxy": {"protocol": "http","host": "39.123.33.154","port": 10234,"username": "","password": ""},"args": [],"metadata": {"description":"一個演示用的實例"},"fingerprint": {"screen":{"width":800,"height":600},"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36","userAgentData": {"productName": "Google Chrome", "productVersion": "133.0.6943.142",  "isMobile": false,  "platform": "Windows",  "platformVersion": "15.0.0",  "architecture": "x86", "bitness": "64",  "model": "",  "wow64": false}}
}# 發送POST請求創建瀏覽器實例
response = requests.post(api_url, json=request_data)# 檢查響應狀態碼
if response.status_code == 200:response_data = response.json()print("瀏覽器實例創建成功:")print(response_data)# 獲取CDP連接信息cdp_ws_url = response_data["automation"]["cdpWsUrl"]# 使用Playwright連接到瀏覽器實例with sync_playwright() as p:browser = p.chromium.connect_over_cdp(cdp_ws_url)# ... Todoelse:print(f"請求失敗,狀態碼: {response.status_code},錯誤信息: {response.text}")

以上就是一個使用SDK的簡單示例,我們在啟動時,提供了一個基于Http協議的代理,以及提供了屏幕大小、UA的指紋模擬。并在啟動完成之后,通過cdpWsUrl,將瀏覽器實例與Playwright進行連接,最終完成我們的爬蟲操作。

總結

本文從理論到實踐,詳細介紹了一個輕量級指紋瀏覽器SDK的設計與實現。文章強調了易用性,將SDK功能聚焦于創建、關閉和查看瀏覽器實例三個核心操作。文中詳細說明了指紋數據模型結構,包括屏幕分辨率、用戶代理、平臺信息等多個維度,確保瀏覽器實例的唯一性。

接口設計部分提供了完整的API文檔,并通過一個Python和Playwright的案例展示了實際應用。這一實現不僅將之前討論的反爬蟲理論付諸實踐,還為開發者提供了一個靈活、易用的工具,幫助他們在復雜的反爬蟲環境中更有效地進行數據采集工作。并成功地將復雜的反爬蟲技術轉化為可操作的開發實踐,為讀者搭建了理論與實踐之間的橋梁。

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

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

相關文章

C++數據排序( 附源碼 )

一.冒泡排序 原理:自左向右依次遍歷,若相鄰兩數順序錯誤,則交換兩數. 這樣,每一輪結束后,最大/最小的數就會到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

I2C 讀寫 AT24C02

根據AT24C02的 Datasheet 可知AT24C02有2K bit&#xff0c;即256B&#xff0c;分為32頁,每頁8個字節&#xff0c;結合數據手冊和原理圖可以得知&#xff0c;板載AT24C02的讀地址為0xA2&#xff0c;寫地址為0xA3&#xff1a; #define AT24C02_ADDR_WRITE 0xA2 #define AT24C02_…

K8S學習之基礎七十四:部署在線書店bookinfo

部署在線書店bookinfo 在線書店-bookinfo 該應用由四個單獨的微服務構成&#xff0c;這個應用模仿在線書店的一個分類&#xff0c;顯示一本書的信息&#xff0c;頁面上會顯示一本書的描述&#xff0c;書籍的細節&#xff08;ISBN、頁數等&#xff09;&#xff0c;以及關于這本…

Linux 查找文本中控制字符所在的行

參考資料 ASCIIコード表 目錄 一. 業務背景二. 遇到的問題三. 分析3.1 url編碼的前置知識3.2 出現控制字符的transactionid分析3.3 16進制分析 四. 從文本中查找控制字符所在的行五. 控制字符一覽 一. 業務背景 ?在項目中&#xff0c;業務請求對應著下URL http://www.test.…

python將pdf文件轉為圖片,如果pdf文件包含多頁,將轉化的多個圖片通過垂直或者水平合并成一張圖片

要將PDF文件轉換為圖片&#xff0c;并將多頁PDF垂直合并成一張圖片&#xff0c;可以使用PyMuPDF&#xff08;也稱為fitz&#xff09;庫來讀取PDF文件&#xff0c;并使用Pillow庫來處理和合并圖片。以下是一個示例代碼&#xff0c;展示了如何實現這個功能&#xff1a; 首先&…

HarmonyOS 基礎組件和基礎布局的介紹

1. HarmonyOS 基礎組件 1.1 Text 文本組件 Text(this.message)//文本內容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字體大小.maxLines(1)// 最大行數.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出顯示....fontColor(Color.Black).…

FrameWork基礎案例解析(四)

文章目錄 單獨拉取framework開機與開機動畫橫屏Android.mk語法單獨編譯SDKmake 忽略warning單獨修改和編譯Camera2單獨編譯Launcher3Android Studio 導入、修改、編譯Settings導入 Android Studio 導入、修改、編譯Launcher3android 開機默認進入指定Launcher植入自己的apk到系…

基于vscode(GDB)調試ros2節點

一、環境準備 必備vscode插件 1&#xff09;Docker Docker - Visual Studio Marketplace 2&#xff09;Dev Containers Dev Containers - Visual Studio Marketplace 3&#xff09;GDB GDB Debug - Visual Studio Marketplace 二、進去docker鏡像 1&#xff09;docker安…

基于springboot的考研成績查詢系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 這些年隨著Internet的迅速發展&#xff0c;我們國家和世界都已經進入了互聯網大數據時代&#xff0c;計算機網絡已經成為了整個社會以及經濟發展的巨大動能&#xff0c;考研成績查詢管理事務現在已經成為社會關注的重要內容&#xff0c;因此運用互聯網技術來提高考研成績…

C++:算術運算符

程序員Amin &#x1f648;作者簡介&#xff1a;練習時長兩年半&#xff0c;全棧up主 &#x1f649;個人主頁&#xff1a;程序員Amin &#x1f64a; P? ?S : 點贊是免費的&#xff0c;卻可以讓寫博客的作者開心好久好久&#x1f60e; &#x1f4da;系列專欄&#xff1a;Java全…

PyQt6實例_A股日數據維護工具_使用

目錄 前置&#xff1a; 下載預備更新的數據 使用工具更新 用工具下載未復權、前復權、權息數據 在PostgreSQL添加兩個數據表 工具&視頻 前置&#xff1a; 1 本系列將以 “PyQt6實例_A股日數據維護工具” 開頭放置在“PyQt6實例”專欄 2 日數據可在“數據庫”專欄&…

REST 方法

FUNCTION ZFM_INTERFACE_LOG. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" REFERENCE(IV_DSTART) TYPE EDI_UPDDAT *"---------------------------------------…

QT 中的元對象系統(五):QMetaObject::invokeMethod的使用和實現原理

目錄 1.簡介 2.原理概述 3.實現分析 3.1.通過方法名調用方法的實現分析 3.2.通過可調用對象調用方法的實現分析 4.使用場景 5.總結 1.簡介 QMetaObject::invokeMethod 是 Qt 框架中的一個靜態方法&#xff0c;用于在運行時調用對象的成員函數。這個方法提供了一種動態調…

Unity3D開發AI桌面精靈/寵物系列 【三】 語音識別 ASR 技術、語音轉文本多平臺 - 支持科大訊飛、百度等 C# 開發

Unity3D 交互式AI桌面寵物開發系列【三】ASR 語音識別 該系列主要介紹怎么制作AI桌面寵物的流程&#xff0c;我會從項目開始創建初期到最終可以和AI寵物進行交互為止&#xff0c;項目已經開發完成&#xff0c;我會仔細梳理一下流程&#xff0c;分步講解。 這篇文章主要講有關于…

Java 狀態模式 詳解

狀態模式詳解 一、狀態模式概述 狀態模式(State Pattern)是一種行為型設計模式&#xff0c;它允許一個對象在其內部狀態改變時改變它的行為&#xff0c;使對象看起來似乎修改了它的類。 核心特點 狀態封裝&#xff1a;將每個狀態的行為封裝到獨立的類中狀態轉換&#xff1a…

Nginx 配置 HTTPS 與 WSS 完整指南

Nginx 配置 HTTPS 與 WSS 完整指南 本教程將手把手教你如何為網站配置 HTTPS 加密訪問&#xff0c;并通過反向代理實現安全的 WebSocket&#xff08;WSS&#xff09;通信。以 https://www.zhegepai.cn 域名為例&#xff0c;完整流程約需 30 分鐘完成。 一、前置準備 1.1 域名…

雙向鏈表的理解

背景 代碼中經常會出現雙向鏈表&#xff0c;對于雙向鏈表的插入和刪除有對應的API函數接口&#xff0c;但直觀的圖表更容易理解&#xff0c;所以本文會對rt-thread內核代碼中提供的雙向鏈表的一些API函數操作進行繪圖&#xff0c;方便后續隨時查看。 代碼塊 rt-thread中提供…

大文件上傳源碼,支持單個大文件與多個大文件

大文件上傳源碼&#xff0c;支持單個大文件與多個大文件 Ⅰ 思路Ⅱ 具體代碼前端--單個大文件前端--多個大文件前端接口后端 Ⅰ 思路 具體思路請參考我之前的文章&#xff0c;這里分享的是上傳流程與源碼 https://blog.csdn.net/sugerfle/article/details/130829022 Ⅱ 具體代碼…

Unity中的靜態合批使用整理

靜態批處理是一種繪制調用批處理方法&#xff0c;它組合不移動的網格以減少繪制調用。它將組合的網格轉換為世界空間&#xff0c;并為它們構建一個共享頂點和索引緩沖區。然后&#xff0c;對于可見網格&#xff0c;Unity 會執行一系列簡單的繪制調用&#xff0c;每個調用之間幾…

【機器學習中的基本術語:特征、樣本、訓練集、測試集、監督/無監督學習】

機器學習基本術語詳解 1. 特征&#xff08;Feature&#xff09; 定義&#xff1a;數據的屬性或變量&#xff0c;用于描述樣本的某個方面。作用&#xff1a;模型通過學習特征與目標之間的關系進行預測。示例&#xff1a; 預測房價時&#xff0c;特征可以是 面積、地段、房齡。…