1、原因。
抓取数据时,有一些网站 设置了一些反爬虫设置,进而将本身本地 IP 地址拉入系统黑名单。从而达到禁止本地 IP 访问数据的请求。
2、思路。
根据其余 代理 IP 网站,进行一个免费的代理 IP 进行搜集,而后进行统一 验证 管理
以下图:html
3、抓取包含代理 IP 的网站页面。
抓取来网站代码以后,利用 HtmlAgilityPack 进行 html 的解析。并将代理 IP 验证,存放队列等操做。git
4、直接看效果图。
运行效果。
浏览器 请求 :http://127.0.0.1:12306/ 效果。github
就这样,一个简单的 属于本身的 代理 IP 池,就作好了 。。。浏览器
放上 关于 HttpListener 监听的代码网站
public static void Lisener() { Console.Title = url; HttpListener listerner = new HttpListener(); { listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问 listerner.Prefixes.Add(url); listerner.Start(); new Thread(new ThreadStart(delegate { while (true) { HttpListenerContext httpListenerContext = listerner.GetContext(); new Thread(new ThreadStart(delegate { HttpListenerContext ctx = httpListenerContext; try { using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream)) { ctx.Response.StatusCode = 200; string ipp = ctx.Request.QueryString["ipp"]; if (null != ipp && Regex.IsMatch(ipp, @"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}$")) { Console.WriteLine("{0}> 删除代理{1}", DateTime.Now.ToString("s"), ipp); QueueOperation(new ProxyViewModel() { Id = ipp }, IQueueType.Del); writer.WriteLine("true"); } else { int count = 0; while (true) { if (count > 10) { writer.WriteLine("false"); break; } // 出队已个代理IP对象 var que = QueueOperation(null, IQueueType.DeQueue); if (que.First().Key > 0) { // 判断该代理IP时间在5分钟内产生的直接返回使用 if ((que.First().Value.CreateTime.AddMinutes(5)) > DateTime.Now) { Console.WriteLine("{0}> 直接输出{1}", DateTime.Now.ToString("s"), que.First().Value.Id); // 输出http响应代码 writer.WriteLine(que.First().Value.Id); QueueOperation(que.First().Value, IQueueType.EnQueue); break; } else { // 验证代理IP有效性 if (DbVerIp(que.First().Value)) { Console.WriteLine("{0}> 验证输出{1}", DateTime.Now.ToString("s"), que.First().Value.Id); // 输出http响应代码 writer.WriteLine(que.First().Value.Id); // 退出本次请求 break; } } } count++; // 队列无可用代理IP状况下等待2秒再获取 Thread.Sleep(TimeSpan.FromSeconds(2)); } } //writer.Close(); //ctx.Response.Close(); } } catch (Exception ex) { try { Console.WriteLine("{0}> 接口異常:{1}", DateTime.Now.ToString("s"), ex.Message); using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream)) { ctx.Response.StatusCode = 200; writer.WriteLine("false"); } } catch (Exception e) { } } })).Start(); } })).Start(); } }
源码 地址: https://github.com/Yahuiya/Proxyui
若是有什么错误的,还请指出,哈哈哈哈哈url