作为爬虫,在采集数据的过程中我们会遇到很多的状态码,不同的状态码代表不同的意思。那么我们今天就重点来了解下爬虫程序返回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的标准应答模式 ,面对这样的情况我们只有降低程序的并发请求,或者增加更大的并发量。如果不改变就会导致代理通道堵塞,访问的效果就会更差。