zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    【转】SQL server 随机数函数
    [HTML] 焦点的丢失和回复
    [PHP] PHP & HTML & JavaScript & MySQL 代码如何互相传值
    [TWAIN] 3句话总结TWAIN在Windows Server 2008 R2 SP1的使用
    PHP & HTML & JavaScript & MySQL中GBK中文乱码解决
    PDFCreator 安装在Win 2008 R2 Server.
    cer格式证书变换成crt格式
    如何在WI 5.4上激活Receiver下载和更新
    啊喂
    [Receiver 3.3][首发] Receiver 的命令安装
  • 原文地址:https://www.cnblogs.com/zyhbook/p/9498302.html
Copyright © 2011-2022 走看看