無頭瀏覽器與請求簽名技術-Cloudflare防護

爬蟲代理

在實際數據采集實踐中,許多目標網站(例如 Amazon)都會采用 Cloudflare 等防護措施,防止機器人和非正常流量。本文將分享一個故障場景下的排查與改進方案,講述如何利用無頭瀏覽器、請求簽名技術以及爬蟲代理 IP來實現數據采集。

本文結構如下:

  • 時間軸呈現方案進程
  • 方案分析
  • 架構改進方案

時間軸呈現方案進程

  1. 初次嘗試(T0):
    在最初采集 Amazon 商品信息時,使用常規的請求方式(如 Python 的 requests 庫)直接訪問目標頁面,但由于 Cloudflare 的機制,返回了驗證碼頁面或直接拒絕訪問。
  2. 排查與調試(T1):
    經過詳細分析,確認 Cloudflare 主要通過檢測 Cookie、User-Agent 以及請求行為來判斷是否為真實用戶。傳統的請求方式難以模擬完整的瀏覽器環境,導致防護措施生效。
  3. 引入無頭瀏覽器(T2):
    為了完整地執行頁面中的 JavaScript,并獲取有效的 Cookie 信息,開始采用 Selenium 等無頭瀏覽器方案。同時,利用代理 IP 技術規避單 IP 訪問過于集中的風險。
  4. 請求簽名技術落地(T3):
    在無頭瀏覽器獲取到 Cookie 信息后,通過對目標 URL 與 Cookie 的加密計算,生成請求簽名。將簽名附加到后續請求中,進一步模擬瀏覽器真實行為,繞過 Cloudflare 的二次驗證。
  5. 系統測試與數據提取(T4):
    經過多次調試后,成功采集到 Amazon 上的商品標題、價格和評價等信息,同時整個流程在代理支持下實現了穩定的運行。

方案分析

Cloudflare 防護主要依賴以下幾方面來辨識是否為正常用戶請求:

  • Cookie 策略: Cloudflare 會在首次訪問時生成一系列 Cookie,并要求后續請求帶上這些 Cookie,否則將視為異常流量。
  • User-Agent 檢測: 非瀏覽器默認的 User-Agent 或者缺失相關頭信息的請求容易被直接屏蔽。
  • 行為監測與簽名驗證: 通過對請求 URL 及 Cookie 等信息進行加密計算,生成簽名,驗證請求是否來自真實用戶。

傳統的 HTTP 請求難以滿足上述條件,因此本文引入了無頭瀏覽器技術。通過 Selenium 模擬完整的瀏覽器行為,可以獲取到 Cloudflare 設置的 Cookie,再結合自定義的請求簽名算法(例如 MD5 散列計算),將簽名附加到請求中,從而繞過防護。同時,采用爬蟲代理技術,利用代理 IP、用戶名和密碼等信息,確保請求來源的多樣性,進一步降低被限制的風險。


架構改進方案

在當前方案基礎上,為提高系統的穩定性和擴展性,建議從以下幾個方面進行架構改進:

  1. 無頭瀏覽器集群化部署:
    利用 Docker 或 Kubernetes 部署無頭瀏覽器集群,實現并發采集任務的分布式調度。這樣既可以提高采集效率,也能避免單節點故障導致整個系統中斷。
  2. 簽名算法優化:
    根據目標網站的動態檢測機制,持續調整和優化簽名生成算法。可以考慮通過機器學習等方式不斷學習目標網站的防護規則,實現自適應的請求簽名策略。
  3. 代理池管理:
    構建一個自動化代理池,動態監控代理 IP 的可用性,并自動切換故障代理。參考爬蟲代理的接入方式,實現代理IP的自動認證和更新。
  4. 多層次容錯機制:
    在請求失敗或防護觸發時,設置重試、延時等容錯機制,同時記錄失敗日志,方便后續問題排查與數據補采。
  5. 數據清洗與存儲:
    對采集到的數據進行實時清洗、去重,并存儲到數據庫中。可以利用異步消息隊列對爬蟲任務進行解耦,提升系統整體的健壯性。

示例代碼

下面給出一個基于 Selenium 的無頭瀏覽器示例代碼,展示如何設置代理、Cookie、User-Agent,并生成請求簽名以采集 Amazon 商品信息。代碼中引用了爬蟲代理的域名、端口、用戶名和密碼(請根據實際情況替換)。

import time
import hashlib
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import Bydef generate_signature(url, cookies):"""模擬生成請求簽名的邏輯這里簡單地將 URL 與所有 cookie 拼接后計算 MD5 值,實際中可能需要更復雜的算法"""raw = url + ''.join([cookie['name'] + cookie['value'] for cookie in cookies])return hashlib.md5(raw.encode('utf-8')).hexdigest()def scrape_amazon_product(product_url):# 設置 Chrome 無頭瀏覽器選項chrome_options = Options()chrome_options.add_argument("--headless")  # 開啟無頭模式# 設置代理 IP,參考億牛云爬蟲代理的配置(www.16yun.cn)proxy_host = "proxy.16yun.cn"  # 代理服務器域名proxy_port = "8080"               # 代理端口proxy_user = "16YUN"           # 代理用戶名proxy_pass = "16IP"           # 代理密碼# 如果代理需要認證,則需要構造代理認證字符串,此處為簡單示例proxy = f"{proxy_host}:{proxy_port}"chrome_options.add_argument(f'--proxy-server=http://{proxy}')# 設置 User-Agent 模擬真實瀏覽器user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"chrome_options.add_argument(f'user-agent={user_agent}')# 初始化 webdriver(確保已安裝對應的 chromedriver 并配置到環境變量中)driver = webdriver.Chrome(options=chrome_options)try:# 訪問目標頁面(Amazon 商品頁面)driver.get(product_url)# 等待頁面加載及 Cloudflare 防護檢測通過(根據實際情況調整等待時間)time.sleep(5)# 獲取頁面 Cookie,用于生成請求簽名cookies = driver.get_cookies()signature = generate_signature(product_url, cookies)print("生成的請求簽名:", signature)# 提取商品信息(標題、價格、評價等)# 商品標題product_title = driver.find_element(By.ID, "productTitle").text if driver.find_elements(By.ID, "productTitle") else "無商品標題"# 商品價格(價格可能位于不同的元素中,此處僅為示例)try:product_price = driver.find_element(By.ID, "priceblock_ourprice").textexcept Exception as e:product_price = "價格信息獲取失敗"# 商品評價(同樣,評價信息的獲取可能因頁面結構不同而變化)try:product_review = driver.find_element(By.ID, "acrCustomerReviewText").textexcept Exception as e:product_review = "評價信息獲取失敗"print("商品標題:", product_title)print("商品價格:", product_price)print("商品評價:", product_review)finally:# 關閉瀏覽器driver.quit()if __name__ == '__main__':# 示例目標商品鏈接(請替換為實際存在的商品鏈接)target_url = "https://www.amazon.com/dp/B08N5WRWNW"scrape_amazon_product(target_url)

代碼說明

  • 無頭瀏覽器設置: 通過 chrome_options.add_argument("--headless") 啟用無頭模式,以便在后臺靜默運行瀏覽器。
  • 代理 IP 配置: 利用爬蟲代理提供的域名、端口、用戶名和密碼,設置代理服務器,從而規避單 IP 請求風險。
  • User-Agent 與 Cookie: 在啟動瀏覽器時,設置 User-Agent 參數;同時,瀏覽器執行頁面中的 JavaScript 后能自動獲取 Cloudflare 下發的 Cookie,這為后續請求簽名提供數據支持。
  • 請求簽名: 通過將目標 URL 與 Cookie 拼接后計算 MD5 散列值,模擬生成請求簽名。

總結

在面對 Cloudflare 防護和復雜網站反爬機制時,單一的 HTTP 請求方案往往難以奏效。通過引入無頭瀏覽器,可以完整模擬真實用戶的瀏覽行為;結合請求簽名技術,進一步通過 Cookie 與請求參數的加密驗證,實現了對防護機制的繞過。同時,采用爬蟲代理 IP確保了請求的分散性與穩定性。

未來,通過無頭瀏覽器集群化、代理池管理及簽名算法優化,可以不斷提升數據采集的效率與成功率,為故障排查及架構改進提供更加成熟的解決方案。

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

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

相關文章

Spring Cloud之注冊中心之Nacos健康監測和環境隔離

目錄 Nacos健康檢查 兩種健康檢查機制 Nacos服務類型實例 Nacos環境隔離 創建namespace 配置namespace Nacos健康檢查 兩種健康檢查機制 Nacos作為注冊中?, 需要感知服務的健康狀態, 才能為服務調??提供良好的服務. Nacos 中提供了兩種健康檢查機制: 客?…

Vue3實戰學習(Element-Plus常用組件的使用(輸入框、下拉框、單選框多選框、el-image圖片))(上)(5)

目錄 一、Vue3工程環境配置、項目基礎腳手架搭建、Vue3基礎語法、Vue3集成Element-Plus的詳細教程。(博客鏈接如下) 二、Element-Plus常用組件使用。 &#xff08;1&#xff09;el-input。(input輸入框) <1>正常狀態的el-input。 <2>el-input的disable狀態。 <3…

微服務——網關、網關登錄校驗、OpenFeign傳遞共享信息、Nacos共享配置以及熱更新、動態路由

之前學習了Nacos&#xff0c;用于發現并注冊、管理項目里所有的微服務&#xff0c;而OpenFeign簡化微服務之間的通信&#xff0c;而為了使得前端可以使用微服務項目里的每一個微服務的接口&#xff0c;就應該將所有微服務的接口管理起來方便前端調用&#xff0c;所以有了網關。…

2025年3月11日(有限元牛頓迭代法:通俗講解與示例)

牛頓迭代法的正確流程解釋 是的&#xff0c;你的理解基本正確&#xff01;但需要更準確地描述內外力的關系和迭代邏輯。以下是更清晰的步驟說明&#xff1a; 核心流程&#xff08;修正版&#xff09; 假設已知 外力 ( F_{\text{ext}} )&#xff08;如2000 N&#xff09;&…

爬蟲的精準識別:基于 User-Agent 的正則實現

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

【AI大模型】LLM訓練deepseek如何識別視頻

要讓像DeepSeek這樣的大語言模型&#xff08;LLM&#xff09;具備視頻識別能力&#xff0c;需要結合多模態學習技術&#xff0c;將視覺信息與文本語義進行融合。以下是實現這一目標的關鍵步驟和技術要點&#xff1a; --- 一、視頻識別的核心挑戰 1. 多模態數據&#xff1a;視頻…

【物聯網-以太網-W5500】

物聯網-以太網-W5500 ■ W5500-簡介■■■■ ■ W5500-簡介 ■ ■ ■ ■

centos linux安裝mysql8 重置密碼 遠程連接

1. 下載并安裝 MySQL Yum 倉庫 從 MySQL 官方網站下載并安裝 Yum 倉庫配置文件。 # 下載MySQL 8.0的Yum倉庫包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安裝Yum倉庫包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 啟…

C++【類和對象】(超詳細!!!)

C【類和對象】 1.運算符重載2.賦值運算符重載3.日期類的實現 1.運算符重載 (1).C規定類類型運算符使用時&#xff0c;必須轉換成調用運算符重載。 (2).運算符重載是具有特殊名字的函數&#xff0c;名字等于operator加需要使用的運算符&#xff0c;具有返回類型和參數列表及函數…

【面試】Java 多線程

多線程 1、什么是線程和進程2、創建線程有幾種方式3、線程有幾種狀態4、什么是上下文切換5、什么是守護線程&#xff0c;和普通線程有什么區別6、什么是線程池&#xff0c;如何實現的7、Executor和Executors的區別8、線程池處理任務的流程9、線程數設定成多少更合適10、執行exe…

宿主機運行pyspark任務讀取docker hadoop容器上的數據

熬了四個大夜才搞明白&#xff0c;最晚一天熬到早上十點/(ㄒoㄒ)/~~&#xff0c;最后發現只要加個參數就解決了。。。抱頭痛哭 問題描述&#xff1a; Hadoop集群部署在docker容器中&#xff0c;宿主機執行pyspark程序讀取hive表 問題一&#xff1a;當master(local[*])時&…

《平凡的世界》:在泥土中尋找星辰的勇氣

“平凡不是平庸的代名詞&#xff0c;而是千萬人用脊梁扛起時代的勛章。”——路遙的《平凡的世界》用百萬字書寫了黃土地上孫少安、孫少平兩兄弟的掙扎與覺醒&#xff0c;撕開了“奮斗逆襲”的浪漫濾鏡&#xff0c;告訴你&#xff1a;真正的英雄主義&#xff0c;是在認清了生活…

【SpringMVC】深入解析使用 Postman 和瀏覽器模擬將單個與多個參數傳遞到后端和后端接收過程

SpringMVC—請求(Request) 訪問不同的路徑&#xff0c;就是發送不同的請求&#xff1b;在發送請求時&#xff0c;可能會帶一些參數&#xff0c;所以學習Spring的請求&#xff0c;主要是學習如何傳遞參數到后端以及后端如何接收&#xff1b; 我們主要是使用 瀏覽器 和 Postman …

04 | 初始化 fastgo 項目倉庫

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入我的訓練營&#xff1a;云原生AI實戰營&#xff0c;一個助力 Go 開發者在 AI 時代建立技術競爭力的實戰營&#xff1b;本節課最終源碼位于 fastgo 項目的 feature/s01 分支&#x…

Docker 安裝成功后,安裝 Dify 中文版本的步驟

Docker 安裝成功后&#xff0c;安裝 Dify 中文版本的步驟如下1&#xff1a; 克隆 Dify 代碼倉庫&#xff1a;在終端中執行以下命令&#xff0c;將 Dify 源代碼克隆至本地環境。 bash git clone https://github.com/langgenius/dify.git進入 Dify 的 docker 目錄&#xff1a; b…

RPC服務調用深度解析:從原理到Java實踐

一、RPC的核心原理與架構設計 1.1 RPC的本質 RPC&#xff08;Remote Procedure Call&#xff09;是一種分布式系統間通信協議&#xff0c;允許程序像調用本地方法一樣調用遠程服務。其核心目標是通過位置透明性和協議標準化隱藏網絡通信細節。RPC的調用流程可抽象為以下步驟&…

電腦的寫字板如何使用?

打開寫字板&#xff1a; 直接按一下鍵盤上的win R 鍵&#xff0c;然后輸入&#xff1a;write &#xff0c; 再按一下回車 , 即可打開寫字板 可以在里面寫文字 和 插入圖片等… &#xff0c; 如下所示&#xff1a; 保存寫字板內容&#xff1a; 當我們寫好了之后&#xff0c;…

醫療AI測試實戰:如何確保人工智能安全賦能醫療行業?

一、醫療AI測試的重要性 人工智能&#xff08;AI&#xff09;正廣泛應用于醫療行業&#xff0c;如疾病診斷、醫學影像分析、藥物研發、手術機器人和智能健康管理等領域。醫療AI技術的應用不僅提高了診斷效率&#xff0c;還能降低誤診率&#xff0c;改善患者治療效果。然而&…

AI日報 - 2025年3月12日

AI日報 - 2025年3月12日 &#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO預測AI將主導代碼編寫 &#x1f52c; 自訓練技術顯著提升LLM思維清晰度 ▎&#x1f4bc; 商業動向 | OpenAI與CoreWeave達成119億美元基建協議 &…

跳表數據結構

跳表&#xff08;Skip List&#xff09;是一種支持高效插入、刪除和查找的鏈表結構&#xff0c;用于加速查找操作&#xff0c;特別適用于有序數據集合。它在Redis、LevelDB等系統中被用于**有序集合&#xff08;Sorted Set&#xff09;**的實現。 1. 跳表的結構 跳表的核心思…