iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Python

Python大戰之網頁爬蟲系列 第 11

[Day 11] 頻繁請求限制

  • 分享至 

  • xImage
  •  

在昨天學習如何有效地限制特定IP來訪,以避免大量的惡意攻擊後,
今天我們要來學習另外的反爬蟲的相關技術,
也就是昨天有說到的「頻繁請求限制」,那接下來就是今天的學習。

什麼是「頻繁請求限制」

我們在詳細開始學習前,應該要先了解什麼是「頻繁請求限制」,
簡單來說,就是當你在使用爬蟲在短時間內發送過多請求時,
網站會為了保護伺服器的穩定運行,進而對某一IP或帳號的請求數進行限制。
而當超過一定的次數或頻率時,伺服器會拒絕響應,甚至封鎖該IP。

如何限制流量?

這邊就要進行到實作的部份了,而我們這邊使用的一樣是Nginx來作範例,
接下來就開始吧。
首先我們要先找到設置Nginx的配置文件:

https://ithelp.ithome.com.tw/upload/images/20240925/20169196P1B148iXBF.png

在上述的範例中,我想特別講的是*/etc/nginx/nginx.conf*這行程式碼,
它是這邊最重要的一部分,意思是指Nginx 伺服器的核心配置文件的路徑

而通過修改這個文件,就可以配置 Nginx 的行為,其中就包括設置反爬蟲限制
定義虛擬主機、設置網站根目錄等。

再接著,我們就要來學習限制流量了,以下範例:

https://ithelp.ithome.com.tw/upload/images/20240925/20169196GKgd902JBZ.png

在上述的範例中,我想把它拆分做上下部份來分別做解釋:

limit_req_zone:
這行的功用主要是用來定義一個速率的限制區域,用來追蹤和控制請求速率。
而限速區域的參數會被應用到後續的請求限制規則中

$binary_remote_addr
用來表示用戶的 IP 地址。Nginx 會根據每個 IP 來跟蹤每個 IP 的請求次數。
(binary表示是二進制的格式,以此可以節省內存)

zone=mylimit:10m:
這裡的 mylimit 是這個區域的名稱,你也可以任意命名其它的名字。
而10m 則是表示這個區域分配了 10MB 的共享記憶體來儲存 IP 地址
以及其相關請求數據。

rate=10r/s:
這裡則定義了每個 IP 地址每秒最多允許發送的請求數量。
在此範例中是 10 個請求/秒 (r/s 表示 requests per second)

講完上半部份後,這邊進到下面的部份:

limit_req:
這條指令實際應用到上面定義的 mylimit 區域,並將這個速率限制規則
應用到後續的請求。

burst=20:
burst 設置了允許超過速率限制的突發請求數量。
這就表示短時間內可以允許最多 20 個額外請求(加上 rate 定義的速率)。

舉個例子,如果速率是 10r/s,那麼即使一個用戶一秒內發送 30 個請求,
只要突發數量在 20 個內,Nginx 會允許這些請求進入而不立即拒絕。

nodelay:
nodelay 表示即使突發請求超過常規速率,也不會延遲處理,而是立即進行。
如果沒有這個參數,超過 rate 的請求會被延遲處理。
加入 nodelay 是為了讓 burst 內的請求能夠即時被處理,而不等待速率
回到正常。

以上就是針對這個範例各個的程式碼詳細說明,
其實主要就是為了設置速率的限制參數。
而下面的內容(如測試配置,重啟使其生效),
因為跟昨天的內容都大同小異,這邊就不用來繼續水篇幅了。


小結:

這篇主要的學習內容專注在如何限制過度頻繁的請求,以避免網頁伺服器的崩潰。
其實這兩天的學習可能都不會真的實際應用到,
畢竟這次鐵人賽的重點是擺在爬蟲的執行,而非抵擋爬蟲的反爬蟲。
但我想,多了解一些多的知識,對我來說也絕對不是一件壞事,多做多學嘛。

參考資料:
https://hackmd.io/@winnienotes/SJyXK5TIj
https://medium.com/evan-fang/nginx-rate-limiting-%E4%BD%BF%E7%94%A8limit-req-zone%E4%BE%86%E9%99%90%E5%88%B6request%E9%87%8F-f72936ebbbac


上一篇
[Day 10] 反爬蟲機制
下一篇
[Day 12] 爬蟲環境設置-Python
系列文
Python大戰之網頁爬蟲29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言