作爲爬蟲,在採集數據的過程中我們會遇到很多的狀態碼,不同的狀態碼代表不同的意思。那麼我們今天就重點來了解下爬蟲程序返回429意味着什麼?
我們就以淘寶爲例進行分析,淘寶的反爬機制大家都懂,不是一般的嚴格,掛代理是最基本的要求。但是也需要配合更多的反爬策略一起進行纔能有理想的效果。我們先來展示下訪問淘寶的代碼示例。
import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import java.io.IOException; public class Main { # 代理服務器(產品官網 www.16yun.cn) private static final String PROXY_HOST = "u6887.b70.tp.16yun"; private static final int PROXY_PORT = 31111; public static void main(String[] args) { HttpClient client = new HttpClient(); HttpMethod method = new GetMethod("https://www.taobao.com/"); HostConfiguration config = client.getHostConfiguration(); config.setProxy(PROXY_HOST, PROXY_PORT); client.getParams().setAuthenticationPreemptive(true); String username = "16ABCCKJ"; String password = "712323"; Credentials credentials = new UsernamePasswordCredentials(username, password); AuthScope authScope = new AuthScope(PROXY_HOST, PROXY_PORT); client.getState().setProxyCredentials(authScope, credentials); try { client.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { String response = method.getResponseBodyAsString(); System.out.println("Response = " + response); } } catch (IOException e) { e.printStackTrace(); } finally { method.releaseConnection(); } } } HttpClient4.x JSoup JSoup全局代理 Connection Htmlunit Okhttp
在我們掛上代理訪問淘寶的時候就返回了超級多的429,如圖:
雖然我們掛的代理高達80併發但是請求還是比較多,超出了併發量,所以幾乎都是返回的429。
這是HTTP\HTTPS的標準應答模式 ,面對這樣的情況我們只有降低程序的併發請求,或者增加更大的併發量。如果不改變就會導致代理通道堵塞,訪問的效果就會更差。