2022-12-14 15:36

在互联网上进行自动数据采集已是互联网从业者的常规操作,爬虫程序想要长期稳定地进行数据采集,都会使用到爬虫代理来避免目标网站的IP访问限制。在数据采集过程中难免会遇到各种各样的问题,若想要想要快速分析数据采集过程中的问题,我们该怎么做呢?其实可以通过HTTP返回的各种状态码进行判断。今天就来重点讨论下这几个错误应该如何解决。
一、出现HTTP的407错误
几种情况下会出现http的407、408错误:
1. 全部是http的407错误,是代理认证信息不对。
1. 少量http的407错误,大量http的200请求成功,有些语言库第一次请求不会传递认证信息,自动发起第二次请求并将认证信息传递,属正常情况。
1. 少量http的200请求成功,少量http的407错误,大量http的429错误,有可能是每秒请求数大量超出代理限定,代理直接返回相关错误。
二、429 Too Many Requests
您的请求过快,请降低请求速率
注意:如果遇到过多429,可以考虑减少线程数量(并发数量),或加上时间间隔(建议 >300ms)。请求超过代理限制,严格按照所开代理的请求数,按照300毫秒为单位进行管理。如果限制之后,既然大量429,需要优化爬虫策略,应该是目标网站返回的错误提示。
三、http状态码403  503 或504
原因:少量不影响,大量403  503或504需要优化爬虫策略
四、504 Proxy Gateway TimeoutLink
代理正在切换IP,请稍后(30秒)再试
目标网站不可达
注意:如果出现少量504属于正常情况。如大量出现,建议在不使用代理的情况下检查目标网站是否可以访问。 可能由目标网站的防护措施导致。

代理在爬虫程序里面的实现也是很重要的一部分,以下就提供一个demo给有需要学习的朋友参考参考,各种语言之间代理的使用有细微的差别,可以搜索亿牛云了解其他语言的参考示例。

// 要访问的目标页面
string targetUrl = "http://httpbin.org/ip";




// 代理服务器(产品官网 www.16yun.cn)
string proxyHost = "http://t.16yun.cn";
string proxyPort = "31111";


// 代理验证信息
string proxyUser = "username";
string proxyPass = "password";


// 设置代理服务器
WebProxy proxy = new WebProxy(string.Format("{0}:{1}", proxyHost, proxyPort), true);




ServicePointManager.Expect100Continue = false;


var request = WebRequest.Create(targetUrl) as HttpWebRequest;


request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.Method = "GET";
request.Proxy = proxy;


//request.Proxy.Credentials = CredentialCache.DefaultCredentials;


request.Proxy.Credentials = new System.Net.NetworkCredential(proxyUser, proxyPass);


// 设置Proxy Tunnel
// Random ran=new Random();
// int tunnel =ran.Next(1,10000);
// request.Headers.Add("Proxy-Tunnel", String.valueOf(tunnel));




//request.Timeout = 20000;
//request.ServicePoint.ConnectionLimit = 512;
//request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36";
//request.Headers.Add("Cache-Control", "max-age=0");
//request.Headers.Add("DNT", "1");




//String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(proxyUser + ":" + proxyPass));
//request.Headers.Add("Proxy-Authorization", "Basic " + encoded);


using (var response = request.GetResponse() as HttpWebResponse)
using (var sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
 string htmlStr = sr.ReadToEnd();
}



评论