一、缘由。
抓取数据时,有一些网站 设置了一些反爬虫设置,进而将自己本地 IP 地址拉入系统黑名单。从而达到禁止本地 IP 访问数据的请求。
二、思路。
根据其他 代理 IP 网站,进行一个免费的代理 IP 进行搜集,然后进行统一 验证 管理
如下图:
三、抓取包含代理 IP 的网站页面。
抓取来网站代码之后,利用 HtmlAgilityPack 进行 html 的解析。并将代理 IP 验证,存放队列等操作。
四、直接看效果图。
运行效果。
浏览器 请求 :http://127.0.0.1:12306/ 效果。
就这样,一个简单的 属于自己的 代理 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/Proxy
如果有什么错误的,还请指出,哈哈哈哈哈