如何動態調整Python爬蟲的Request請求延遲

引言

在網絡爬蟲開發中,合理控制請求延遲(Request Delay)是避免被封禁、提高爬取效率的關鍵。固定延遲(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">time.sleep(1)</font>**)雖然簡單,但在面對不同網站的反爬策略時可能不夠靈活。動態調整請求延遲能夠更智能地適應目標網站的變化,提高爬蟲的穩定性和效率。

本文將介紹如何動態調整Python爬蟲的請求延遲,包括:

  1. 固定延遲 vs. 動態延遲的優劣
  2. 基于響應狀態碼的動態延遲調整
  3. 基于請求頻率的動態延遲調整
  4. 結合代理IP和用戶代理(User-Agent)優化延遲

1. 固定延遲 vs. 動態延遲

1.1 固定延遲

固定延遲是最簡單的控制方式,例如:

import time
import requestsfor url in urls:response = requests.get(url)time.sleep(1)  # 固定延遲1秒

優點:實現簡單,適用于低頻率爬取。
缺點

  • 如果目標網站允許更快的請求,固定延遲會降低爬取效率。
  • 如果目標網站檢測到固定間隔請求,可能觸發反爬機制。

1.2 動態延遲

動態延遲根據網站響應、請求頻率等因素調整等待時間,例如:

  • 如果服務器返回 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">429 Too Many Requests</font>**,則增加延遲。
  • 如果連續多次請求成功,則適當降低延遲。
  • 隨機化延遲,模擬人類操作。

2. 基于響應狀態碼的動態延遲

如果服務器返回 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">429</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">503</font>**,說明請求頻率過高,此時應增加延遲;如果正常返回 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">200</font>**,則可以適當降低延遲。

實現代碼

import time
import requests
import randomclass DynamicDelayCrawler:def __init__(self, base_delay=1, max_delay=5):self.base_delay = base_delay  # 基礎延遲self.max_delay = max_delay    # 最大延遲self.current_delay = base_delaydef adjust_delay(self, status_code):if status_code == 429:  # 請求過多,增加延遲self.current_delay = min(self.current_delay * 2, self.max_delay)elif status_code == 200:  # 請求成功,嘗試降低延遲self.current_delay = max(self.current_delay * 0.9, self.base_delay)def crawl(self, url):try:response = requests.get(url)self.adjust_delay(response.status_code)print(f"URL: {url}, Status: {response.status_code}, Delay: {self.current_delay:.2f}s")time.sleep(self.current_delay)return response.textexcept Exception as e:print(f"Error fetching {url}: {e}")time.sleep(self.current_delay * 2)  # 出錯時增加延遲return None# 測試
crawler = DynamicDelayCrawler(base_delay=1, max_delay=10)
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
for url in urls:crawler.crawl(url)

3. 基于請求頻率的動態延遲

某些網站可能沒有明確的 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">429</font>** 響應,但會通過其他方式限制爬蟲(如封IP)。我們可以統計單位時間內的請求次數,動態調整延遲。

實現代碼

import time
import requests
from collections import dequeclass RequestRateLimiter:def __init__(self, max_requests=10, time_window=10):self.max_requests = max_requests  # 時間窗口內允許的最大請求數self.time_window = time_window    # 時間窗口(秒)self.request_times = deque()      # 存儲請求時間戳def wait_if_needed(self):now = time.time()# 移除超出時間窗口的請求記錄while self.request_times and now - self.request_times[0] > self.time_window:self.request_times.popleft()if len(self.request_times) >= self.max_requests:# 計算需要等待的時間wait_time = self.time_window - (now - self.request_times[0])print(f"Rate limit reached, waiting {wait_time:.2f}s")time.sleep(wait_time)self.request_times.append(now)# 測試
limiter = RequestRateLimiter(max_requests=5, time_window=5)  # 5秒內最多5次請求
urls = [f"https://example.com/page{i}" for i in range(10)]
for url in urls:limiter.wait_if_needed()response = requests.get(url)print(f"Fetched {url}, Status: {response.status_code}")

4. 結合代理IP和隨機User-Agent優化

動態調整延遲的同時,使用代理IP和隨機User-Agent可以進一步降低被封禁的風險。

實現代碼

import random
import time
import requests
from fake_useragent import UserAgentclass AdvancedCrawler:def __init__(self, base_delay=1, max_delay=10):self.base_delay = base_delayself.max_delay = max_delayself.current_delay = base_delayself.ua = UserAgent()# 添加指定的代理信息self.proxyHost = "www.16yun.cn"self.proxyPort = "5445"self.proxyUser = "16QMSOML"self.proxyPass = "280651"self.proxies = [f"http://{self.proxyUser}:{self.proxyPass}@{self.proxyHost}:{self.proxyPort}",# 如果需要保留原有代理,可以將它們也加入到列表中# "<url id="d02v8neruqkqvdqddo90" type="url" status="failed" title="" wc="0">http://proxy1.example.com:8080</url> ",# "<url id="d02v8neruqkqvdqddo9g" type="url" status="failed" title="" wc="0">http://proxy2.example.com:8080</url> ",]def get_random_proxy(self):return random.choice(self.proxies) if self.proxies else Nonedef adjust_delay(self, status_code):if status_code == 429:self.current_delay = min(self.current_delay * 2, self.max_delay)elif status_code == 200:self.current_delay = max(self.current_delay * 0.9, self.base_delay)def crawl(self, url):headers = {"User-Agent": self.ua.random}proxy = self.get_random_proxy()try:response = requests.get(url,headers=headers,proxies={"http": proxy, "https": proxy} if proxy else None,timeout=10)self.adjust_delay(response.status_code)print(f"URL: {url}, Status: {response.status_code}, Delay: {self.current_delay:.2f}s")time.sleep(self.current_delay + random.uniform(0, 0.5))  # 增加隨機抖動return response.textexcept Exception as e:print(f"Error fetching {url}: {e}")time.sleep(self.current_delay * 2)return None# 測試
crawler = AdvancedCrawler(base_delay=1, max_delay=10)
urls = [f"https://example.com/page{i}" for i in range(5)]
for url in urls:crawler.crawl(url)

5總結

動態調整Python爬蟲的Request請求延遲是一種有效的優化策略,可以提高爬蟲的穩定性和效率。通過基于響應時間、服務器負載和反爬機制的動態調整策略,爬蟲可以在復雜的網絡環境中靈活運行,同時降低被封禁的風險。本文提供的代碼示例展示了如何實現動態調整請求延遲,開發者可以根據實際需求進行進一步優化和擴展。

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

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

相關文章

QSS【QT】

文章目錄 QSSid選擇器 & 類型選擇器偽類選擇器盒子模型 QSS 設置樣式的時候&#xff0c;是可以指定某個控件來設置的。 指定控件之后&#xff0c;此時的樣式就會針對這個指定的控件&#xff0c;也會針對子控件生效 ui->pushButton_2->setStyleSheet("QPushButt…

學習筆記二十二—— 并發五大常見陷阱

?? 并發五大常見陷阱 目錄 數據競爭 (Data Race)死鎖 (Deadlock)競態條件 & 餓死現象 (Race Condition & Starvation)懸掛指針 (Dangling Pointer)重復釋放 (Double Free)開發自查清單 1. 數據競爭 (Data Race) 專業定義 兩個及以上線程在缺乏同步的情況下同時訪問同…

ESP32- 開發筆記- 硬件設計-ESP32-C3基本電路

ESP32的最小電路 1 ESP32固件下載 ESP32 有多種下載(燒錄)固件的方式,具體選擇取決于開發環境和硬件連接。以下是常見的幾種下載方式: 1.1 USB 串口下載(最常用) 適用場景:通過 USB 轉串口芯片(如 CP2102、CH340)連接電腦,使用 esptool 或其他工具燒錄固件。這里…

Qt6文檔閱讀筆記-RESTful API Server解析

本例使用QHttpServer創建RESTful API服務端。 此例接收REST風格的請求&#xff0c;與此例與之對應的客戶端是RESTful Color Palette API client。 滿足REST限制的API被稱為RESTful風格的API。 RESTful API服務端一般包括&#xff1a;create、read、update、delete操作。 其中…

HarmonyOS 基礎語法概述 UI范式

ArkUI框架 - UI范式 ArkTS的基本組成 裝飾器&#xff1a; 用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊的含義。如上述示例中Entry、Component和State都是裝飾器&#xff0c;Component表示自定義組件&#xff0c;Entry表示該自定義組件為入口組件&#xff0c;Stat…

Docker鏡像基本概念與構建指南

Docker鏡像基本概念與構建指南 一、Docker鏡像基本概念 Docker鏡像是容器運行的基礎&#xff0c;包含應用程序及其運行所需的文件系統、依賴庫、環境變量和配置。其核心特性包括&#xff1a; 只讀性&#xff1a;鏡像本身不可修改&#xff0c;容器運行時在鏡像層之上創建可寫…

如何避免 CDN 緩存泄漏用戶隱私數據

CDN 通過將內容緩存到全球各地的邊緣服務器上,顯著縮短了數據傳輸的物理距離,從而加速了內容的交付。然而,這一技術在提升性能的同時,也悄然埋下了一顆隱私隱患的種子——緩存數據可能被不當訪問或泄漏,進而暴露用戶的敏感信息。 目錄 禁用對用戶個人信息的緩存 僅緩存…

軟考中級數據庫系統工程師學習資料分享

軟考中級數據庫系統工程師考試對于很多 IT 從業者和計算機專業的大學生來說&#xff0c;是一個重要的職業資格認證。它不僅能夠提升個人的專業技能&#xff0c;還能為職業發展增添有力的砝碼。今天&#xff0c;我將為大家分享一套全面且實用的學習資料&#xff0c;幫助大家更好…

數據處理: 均值漂移聚類(Mean Shift)

一、 基本原理 Mean Shift是一種基于密度的非參數聚類算法&#xff0c;不需要預先指定簇的數量&#xff0c;而是通過尋找數據空間中密度最大的區域來自動確定聚類中心, 適合圖像分割和目標跟蹤等。 算法步驟 初始化&#xff1a;對每個數據點作為起點。 迭代&#xff1a;計算…

辛格迪客戶案例 | 蘇州富士萊醫藥GMP培訓管理(TMS)項目

一、案例概述 富士萊醫藥股份有限公司位于美麗的江南水鄉常熟&#xff0c;前身為常熟富士萊醫藥化工有限公司&#xff0c;從建廠初期面積僅有10余畝&#xff0c;逐步擴展到100余畝。近年來公司飛速發展&#xff0c;以黑馬姿態發展成為中國專業生產硫辛酸系列產品、肌肽系列產品…

SQL注入相關知識

一、布爾盲注 1、布爾盲簡介 布爾盲注是一種SQL注入攻擊技術&#xff0c;用于在無法直接獲取數據庫查詢結果的情況下&#xff0c;通過頁面的響應來判斷注入語句的真假&#xff0c;從而獲取數據庫中的敏感信息 2、布爾盲注工作原理 布爾盲注的核心在于利用SQL語句的布爾邏輯…

Linux基礎學習--linux的文件權限與目錄配置

linux的文件權限與目錄配置 1.用戶與用戶組 在Linux中&#xff0c;每個文件都有相當多的屬性和權限&#xff0c;其中最重要的概念就是文件的擁有者。 1.1 文件擁有者 Linux是一個多人多任務的系統&#xff0c;常常有多人共用一臺主機的情況出現&#xff0c;因此在系統中可以…

【數據可視化-19】智能手機用戶行為可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

vue項目通過GetCapabilities獲取wmts服務元數據信息并在openlayers進行疊加顯示

vue項目通過openlayers加載wmts服務示例&#xff1a; <template><div id"map" ref"mapContainer"></div> </template><script> import ol/ol.css; import Map from ol/Map; import View from ol/View; import TileLayer fr…

JavaWeb學習打卡-Day1-分層解耦、Spring IOC、DI

三層架構 Controller&#xff08;控制層&#xff09;&#xff1a;接收前端發送的請求&#xff0c;對請求進行處理&#xff0c;并響應數據。Service&#xff08;業務邏輯層&#xff09;&#xff1a;處理具體的業務邏輯。DAO&#xff08;數據訪問層/持久層&#xff09;&#xff…

【含文檔+PPT+源碼】基于Python爬蟲二手房價格預測與可視化系統的設計與實現

項目介紹 本課程演示的是一款基于Python爬蟲二手房價格預測與可視化系統&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 帶你從零開始部署運行本套系統 該項…

游戲引擎學習第229天

倉庫:https://gitee.com/mrxiao_com/2d_game_5 回顧上次內容并介紹今天的主題 上次留下的是一個非常簡單的任務&#xff0c;至少第一步是非常簡單的。我們需要在渲染器中加入排序功能&#xff0c;這樣我們的精靈&#xff08;sprites&#xff09;才能以正確的順序顯示。為此我…

【“星瑞” O6 評測】—NPU 部署 face parser 模型

前言 瑞莎星睿 O6 (Radxa Orion O6) 擁有高達 28.8TOPs NPU (Neural Processing Unit) 算力&#xff0c;支持 INT4 / INT8 / INT16 / FP16 / BF16 和 TF32 類型的加速。這里通過通過官方的工具鏈進行FaceParsingBiSeNet的部署 1. FaceParsingBiSeNet onnx 推理 首先從百度網盤…

單例模式的使用場景 以及 餓漢式寫法(智能指針)

單例模式的使用場景 以及 餓漢式寫法&#xff08;智能指針&#xff09; 餓漢式&#xff1a;創建類時就已經創建好了類的實例&#xff08;用智能指針實現&#xff09;什么時候用單例模式&#xff1a;1. 全局配置管理2. 日志系統3. 資源管理器4. 硬件設備訪問總結 餓漢式&#xf…

微信小程序的全局變量(quanjubianliang)

在微信小程序開發中&#xff0c;管理和使用全局變量是一種常見的需求。例如&#xff0c;可以通過小程序的App實例和globalData對象來實現全局變量的存儲和共享。以下是詳細說明&#xff1a; 1. 全局變量的定義 微信小程序提供了 App() 函數&#xff0c;其中可以定義一個 global…