C#——做一个简单代理IP池

一、缘由。

  抓取数据时,有一些网站 设置了一些反爬虫设置,进而将自己本地 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

如果有什么错误的,还请指出,哈哈哈哈哈

猜你喜欢

转载自www.cnblogs.com/zyhbook/p/9498302.html