【Python】保持Selenium穩定爬取的方法(防檢測策略)

selenium 防檢測策略的方法匯總:

  1. 合理設置延遲:請求間添加隨機延遲 (2-10秒)

  2. 限制爬取頻率:控制每小時/每天的請求量

  3. 輪換用戶代理:準備至少10個不同的User-Agent

  4. 使用住宅代理:優先選擇高質量的住宅代理IP

  5. 處理驗證碼:集成2Captcha或Anti-Captcha服務

  6. 定期更新工具:保持selenium和瀏覽器驅動最新版本

1. 基礎防檢測配置

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsdef get_stealth_driver():options = Options()# 基本防檢測設置options.add_argument("--disable-blink-features=AutomationControlled")options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option("useAutomationExtension", False)# 禁用自動化控制標志options.add_argument("--disable-infobars")options.add_argument("--disable-dev-shm-usage")options.add_argument("--no-sandbox")# 隨機用戶代理user_agents = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."]import randomoptions.add_argument(f"user-agent={random.choice(user_agents)}")driver = webdriver.Chrome(options=options)# 修改navigator.webdriver屬性driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})return driver

2. 高級防檢測技術

2.1 使用 undetected-chromedriver

import undetected_chromedriver as ucdef get_undetected_driver():options = uc.ChromeOptions()# 配置選項options.add_argument("--disable-popup-blocking")options.add_argument("--disable-notifications")# 隨機窗口大小import randomwidth = random.randint(1000, 1400)height = random.randint(700, 900)options.add_argument(f"--window-size={width},{height}")driver = uc.Chrome(options=options,version_main=114,  # 匹配你的Chrome版本headless=False,use_subprocess=True)return driver

2.2 模擬人類行為模式

from selenium.webdriver.common.action_chains import ActionChains
import time
import randomdef human_like_behavior(driver, element=None):"""模擬人類操作行為"""actions = ActionChains(driver)# 隨機鼠標移動if element:actions.move_to_element(element)else:x = random.randint(0, 500)y = random.randint(0, 500)actions.move_by_offset(x, y)# 隨機延遲time.sleep(random.uniform(0.5, 2.5))# 隨機滾動scroll_amount = random.randint(200, 800)driver.execute_script(f"window.scrollBy(0, {scroll_amount})")time.sleep(random.uniform(0.3, 1.8))actions.perform()

3. 完整防檢測爬取流程

def stealth_scrape(url):try:# 使用undetected-chromedriverdriver = get_undetected_driver()# 訪問目標URLdriver.get(url)# 隨機等待time.sleep(random.uniform(2, 5))# 模擬人類瀏覽行為human_like_behavior(driver)# 執行實際爬取操作# 示例:獲取頁面標題title = driver.titleprint(f"成功獲取頁面標題: {title}")# 更多爬取邏輯...except Exception as e:print(f"爬取過程中發生錯誤: {str(e)}")finally:driver.quit()
# 使用示例
stealth_scrape("https://example.com")

4. 額外防護措施

4.1 代理IP輪換

proxies = ["123.45.67.89:8080","98.76.54.32:3128"
] #換成自己的def get_proxy_driver():options = uc.ChromeOptions()proxy = random.choice(proxies)options.add_argument(f"--proxy-server=http://{proxy}")return uc.Chrome(options=options)

4.2 指紋混淆

def modify_fingerprint(driver):# 修改屏幕分辨率driver.execute_script("Object.defineProperty(screen, 'width', {get: () => 1920});""Object.defineProperty(screen, 'height', {get: () => 1080});")# 修改時區driver.execute_cdp_cmd("Emulation.setTimezoneOverride",{"timezoneId": "America/New_York"})# 修改WebGL指紋driver.execute_script("const getParameter = WebGLRenderingContext.prototype.getParameter;""WebGLRenderingContext.prototype.getParameter = function(parameter) {""  if (parameter === 37445) { return 'NVIDIA Corporation'; }""  return getParameter.call(this, parameter);""};")

5. 檢測與驗證

def test_stealth(driver):test_urls = ["https://bot.sannysoft.com","https://arh.antoinevastel.com/bots/areyouheadless"]for url in test_urls:driver.get(url)time.sleep(3)driver.save_screenshot(f"stealth_test_{url.split('/')[-1]}.png")print(f"測試結果已保存: stealth_test_{url.split('/')[-1]}.png")

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

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

相關文章

SpringSecurity源碼解讀AbstractAuthenticationProcessingFilter

一、介紹 AbstractAuthenticationProcessingFilter 是 Spring Security 框架里的一個抽象過濾器,它在處理基于表單的認證等認證流程時起著關鍵作用。它繼承自 GenericFilterBean,并實現了 javax.servlet.Filter 接口。此過濾器的主要功能是攔截客戶端發送的認證請求,對請求…

什么是DDD?為什么它正在取代傳統架構?

什么是DDD?為什么它正在取代傳統架構? 1. 傳統開發模式的痛點 在經典的MVC架構中,開發流程往往從數據庫表結構設計開始,業務邏輯散落在Service層,隨著需求迭代容易形成「大泥球」代碼: 實體類變成純粹的…

基于外部中中斷機制,實現以下功能: 1.按鍵1,按下和釋放后,點亮LED 2.按鍵2,按下和釋放后,熄滅LED 3.按鍵3,按下和釋放后,使得LED閃爍

題目: 參照外部中斷的原理和代碼示例,再結合之前已經實現的按鍵切換LED狀態的實驗,用外部中斷改進其實現。 請自行參考文檔《中斷》當中,有關按鍵切換LED狀態的內容, 自行連接電路圖,基于外部中斷機制,實現以下功能&am…

在SQL中,FROM子句中的子查詢必須指定別名,即使后續未引用該別名

FROM子句中的子查詢必須指定別名 示例錯誤示例及原因:總結: 在SQL中, FROM子句中的子查詢必須指定別名, 即使后續未引用該別名 示例 查詢館藏圖書最多的作者姓名及館藏數量 SELECT 作者, COUNT(圖書編號) AS 館藏數量 FROM 圖…

問道數碼獸 懷舊劇情回合手游源碼搭建教程(反查重優化版)

本文將對"問道數碼獸"這一經典卡通風格回合制手游的服務端部署與客戶端調整流程進行詳細拆解,適用于具備基礎 Windows 運維和手游源碼調試經驗的開發者參考使用。教程以實戰為導向,基于原始說明內容重構優化,具備較高的內容查重避重…

Shell腳本-for循環應用案例

在Shell腳本編程中,for循環是一種強大的工具,用于處理重復性任務。無論是批量處理文件、遍歷目錄內容還是簡單的計數任務,for循環都能提供簡潔而有效的解決方案。本文將通過幾個實際的應用案例來展示如何使用for循環解決具體的編程問題。 案…

Chrmo手動同步數據

地址欄輸入 chrome://sync-internals分別點擊這2個按鈕即可觸發手動同步

為什么圓形在GeoJSON中被表示為多邊形(Polygon)而不是圓形類型

GeoJSON規范中沒有"圓形"類型 GeoJSON是一種用于表示地理空間數據的標準格式,它的規范中只定義了以下幾種基本幾何類型: Point (點) LineString (線) Polygon (多邊形) MultiPoint (多點) MultiLineString (多線) MultiPolygon (多多邊形) GeometryCollection (幾…

大數據組件學習之--Kafka 安裝搭建

一、前置環境 在搭建kafka之前,請確認自己的hadoop、zookeeper是否搭建完成且可正常運行 二、下載并上傳安裝包(鏈接為百度網盤) kafka安裝包 tar -zxvf /opt/software/kafka_2.12-2.4.1.tgz -C /opt/module/ 進入解壓后的目錄更改文件名…

PyQt6基礎_pyqtgraph_折線圖with縮放調節

目錄 字符型橫坐標代碼 折線圖代碼 運行 創建新類,繼承pg.PlotWidget,在新類中實現業務內容,重寫pg.PlotWidget中的wheelEvent方法并使用業務數據實現比較理想的縮放狀態。 字符型橫坐標代碼 class StrAxisItem(pg.AxisItem):def __init…

聯邦元學習實現個性化物聯網的框架

隨著數據安全和隱私保護相關法律法規的出臺,需要直接在中央服務器上收集和處理數據的集中式解決方案,對于個性化物聯網而言,訓練各種特定領域場景的人工智能模型已變得不切實際。基于此,中山大學,南洋理工大學&#xf…

audio 核心服務AudioPolicyService 和AudioFlinger啟動流程

目錄 1、audioserver啟動 2、AudioPolicyService啟動 3、AudioFlinger啟動 audio的核心服務有兩個,AudioPolicyService 和AudioFlinger他們到在audioserver一個進程中 1、audioserver啟動 設備開機,系統啟動時將執行 /system/etc/init/audioserver.rc…

反爬蟲機制中的驗證碼識別:類型、技術難點與應對策略

在互聯網數據抓取領域,驗證碼識別是爬蟲過程中的關鍵環節之一。下面對常見驗證碼類型、技術難點及應對策略進行詳細解析,并提供多種場景下的代碼實現示例。 一、驗證碼類型與技術難點 (一)圖形驗證碼 1. 字符驗證碼 特征&#…

vue element使用el-table時,切換tab,table表格列項發生錯位問題

展示問題 問題描述:使用el-table的fixed"right"屬性后,如果切換tab時,回出現最后一列錯誤的問題 官網提供解決方法:doLayout 需要注意的事項:我這里是通過組件使用的table組件,涉及多層組件封裝…

示例:Spring JDBC 聲明式事務(xml配置形式)

聲明式事務是指在不修改源代碼的情況下通過配置applicationContext.xml自動實現事務控制,其本質是AOP環繞通知。它的觸發時機為:1、當目標方法執行成功時自動提交事務,2、當目標方法拋出運行時異常時,自動事務回滾 核心步驟示例&a…

在vmware中ubuntu系統因為安裝了docker查不到ip地址

問題截圖: 根據提供的截圖信息,可以明確看到ens33網卡處于**物理連接斷開(NO-CARRIER)且接口關閉(DOWN)**的狀態,這是導致無法獲取IP地址的直接原因。以下是針對VMware虛擬機的具體解決方案&am…

51c大模型~合集121

我自己的原文哦~ https://blog.51cto.com/whaosoft/13869815 #大模型何以擅長小樣本學習? 這項研究給出詳細分析 近年來,大語言模型(LLM)在人工智能領域取得了突破性進展,成為推動自然語言處理技術發展與通用人…

Babylon.js 材質統一轉換指南:將 AssetContainer 中的所有材質轉換為 PBRMetallicRoughnessMaterial

在現代 3D 開發中,基于物理的渲染(PBR)已成為行業標準。本文將詳細介紹如何在 Babylon.js 中將 AssetContainer 加載的各種材質統一轉換為 PBRMetallicRoughnessMaterial,實現項目材質的標準化。 為什么需要材質轉換? PBRMetallicRoughness…

Go slice切片使用教程,一次通關!

簡介 Go 中的 切片(slice) 是 Go 最強大、最常用的數據結構之一。它是對數組的輕量封裝,比數組更靈活,幾乎所有的集合處理都用切片來完成。 什么是切片(slice) 切片是一個擁有 長度(len&…

nodejs的包管理工具介紹,npm的介紹和安裝,npm的初始化包 ,搜索包,下載安裝包

nodejs的包管理工具介紹,npm的介紹和安裝,npm的初始化包 ,搜索包,下載安裝包 🧰 一、Node.js 的包管理工具有哪些? 工具簡介是否默認特點npmNode.js 官方的包管理工具(Node Package Manager&am…