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

 

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

转载于:https://www.cnblogs.com/zyhbook/p/9498302.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值