我需要以每分鐘8頁的速度抓取一個網站。現在我希望我對遠程服務器的請求能夠在一分鐘內均勻分配,以便它不會損害它要求的服務器。以統一價格檢索網站
如何保持兩個連續請求之間的統一時間差(秒)?做這個的最好方式是什麼 ?
我需要以每分鐘8頁的速度抓取一個網站。現在我希望我對遠程服務器的請求能夠在一分鐘內均勻分配,以便它不會損害它要求的服務器。以統一價格檢索網站
如何保持兩個連續請求之間的統一時間差(秒)?做這個的最好方式是什麼 ?
這裏真的有兩個單獨的問題。讓我們分別解決這些問題:
第一個問題
我需要以一定比率抓取的網站,可以說,每 分鐘8頁....所以它不會損害服務器是請求。
解釋:我想每分鐘發送超過8個請求,因爲我想對遠程服務器很好。
對於這個答案,有關於使用PHP和Curl限速的related Stack Overflow question。
第二個問題
我想這是我做出的遠程服務器的請求均勻 分佈在分鐘....我怎麼能維持在幾秒鐘內連續兩次請求之間統一的時間 差
解釋:我希望在每個查詢之間有相同的時間量。
這是一個比第一個不同的問題,更棘手。爲此,您需要使用時鐘跟蹤每次請求之前和之後的時間,並不斷對請求所花費的時間和請求的睡眠時間進行平均,以及/或者您經常調用get()的次數。您還必須考慮每個請求需要多長時間(如果您得到非常遲緩的連接會降低您的平均值,以至於您只能每分鐘處理3或4個請求......)
我個人不要認爲這實際上是你需要做的,「這樣它就不會損害服務器」。
這是爲什麼:通常速率限制設置爲「每個最低時間片的上限」。所以這意味着「每分鐘8次請求」意味着它們都可以一分鐘到達一次,但不會超過每分鐘8次。限速器沒有期望他們會在一分鐘內均勻分配。如果他們確實需要這樣做,他們會說「每五秒一次請求」。
難道沒有辦法在PHP中設置某種延遲嗎? – Oleg
@ Oleg是的,它在那裏。但我想,使用延遲並不好。不必要地消耗資源。我猜不是一個可擴展的東西。 –
您提到您有上限約束(每分鐘8次),但您是否也有下限約束(例如每分鐘的最小次數)?如果沒有,你可以每60/8秒使用你的編程語言的sleep()版本..? –