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

 

如果有什么錯誤的,還請指出,哈哈哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM