c#批量抓取免费代理并且验证有效性的实战教程

C#批量抓取免费代理并且验证有效性的实战教程

代理服务器可以帮助我们解决一些访问问题,如境外IP访问等。但是,免费代理服务器资源不稳定,稳定的需要付费购买。本教程主要介绍如何使用C#语言进行批量抓取免费代理,并且验证代理有效性。

1. 获取免费代理网站

在开始之前,需要选择一个可靠的免费代理网站。以西刺代理网站为例,网址为:https://www.xicidaili.com/

2. 使用HtmlAgilityPack解析HTML

使用C#语言中的HtmlAgilityPack库,可以简单快捷地解析HTML文件。首先,需要安装HtmlAgilityPack库:

Install-Package HtmlAgilityPack

然后通过以下代码读取网页内容并解析:

// 引用HtmlAgilityPack库
using HtmlAgilityPack;

// 要抓取的URL
string url = "https://www.xicidaili.com/";

// 使用HttpWebRequest获取响应
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3";
var response = (HttpWebResponse)request.GetResponse();
string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();

// 使用HtmlAgilityPack解析HTML
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

// 获取代理列表
var table = doc.DocumentNode.SelectSingleNode("//table[@id='ip_list']");
var rows = table.SelectNodes(".//tr");

foreach (var row in rows)
{
    var cells = row.SelectNodes(".//td");

    if (cells != null && cells.Count > 1)
    {
        Console.WriteLine(cells[1].InnerText + ":" + cells[2].InnerText);
    }
}

3. 验证代理有效性

获取到代理列表后,需要验证代理的有效性。这里以验证http代理为例:

foreach (var row in rows)
{
    var cells = row.SelectNodes(".//td");

    if (cells != null && cells.Count > 1)
    {
        // 获取代理IP和端口号
        string ip = cells[1].InnerText;
        int port = int.Parse(cells[2].InnerText);

        // 创建http代理
        WebProxy proxy = new WebProxy(ip, port);

        // 使用代理访问百度,如果成功则代理可用
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.baidu.com/");
            request.Proxy = proxy;
            request.Timeout = 5000;
            request.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Console.WriteLine("有效代理:" + ip + ":" + port);
        }
        catch (Exception ex)
        {
            Console.WriteLine("无效代理:" + ip + ":" + port);
        }
    }
}

示例1:获取代理并输出到文件

using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace GetProxy
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://www.xicidaili.com/";
            string fileName = "proxy.txt";

            // 使用HttpWebRequest获取响应
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3";
            var response = (HttpWebResponse)request.GetResponse();
            string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();

            // 使用HtmlAgilityPack解析HTML
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            // 获取代理列表
            var table = doc.DocumentNode.SelectSingleNode("//table[@id='ip_list']");
            var rows = table.SelectNodes(".//tr");

            List<string> proxyList = new List<string>();

            foreach (var row in rows)
            {
                var cells = row.SelectNodes(".//td");

                if (cells != null && cells.Count > 1)
                {
                    string ip = cells[1].InnerText.Trim();
                    int port = int.Parse(cells[2].InnerText.Trim());

                    // 创建http代理
                    WebProxy proxy = new WebProxy(ip, port);

                    // 使用代理访问百度,如果成功则代理可用
                    try
                    {
                        HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create("https://www.baidu.com/");
                        request2.Proxy = proxy;
                        request2.Timeout = 5000;
                        request2.Method = "GET";
                        HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();

                        Console.WriteLine("有效代理:" + ip + ":" + port);

                        // 添加到代理列表
                        proxyList.Add(ip + ":" + port);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("无效代理:" + ip + ":" + port);
                    }
                }
            }

            // 输出到文件
            File.WriteAllLines(fileName, proxyList);
            Console.WriteLine("代理已保存到文件:" + fileName);
            Console.ReadKey();
        }
    }
}

示例2:获取代理并用于Http请求

using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace GetProxy
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://www.xicidaili.com/";

            // 使用HttpWebRequest获取响应
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3";
            var response = (HttpWebResponse)request.GetResponse();
            string html = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();

            // 使用HtmlAgilityPack解析HTML
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            // 获取代理列表
            var table = doc.DocumentNode.SelectSingleNode("//table[@id='ip_list']");
            var rows = table.SelectNodes(".//tr");

            foreach (var row in rows)
            {
                var cells = row.SelectNodes(".//td");

                if (cells != null && cells.Count > 1)
                {
                    string ip = cells[1].InnerText.Trim();
                    int port = int.Parse(cells[2].InnerText.Trim());

                    // 创建http代理
                    WebProxy proxy = new WebProxy(ip, port);

                    // 使用代理访问百度
                    try
                    {
                        HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create("https://www.baidu.com/");
                        request2.Proxy = proxy;
                        request2.Timeout = 5000;
                        request2.Method = "GET";
                        HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();

                        Console.WriteLine("使用代理 " + ip + ":" + port + " 访问百度成功");
                        Console.WriteLine(new StreamReader(response2.GetResponseStream(), Encoding.UTF8).ReadToEnd());
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("使用代理 " + ip + ":" + port + " 访问百度失败");
                    }
                }
            }

            Console.ReadKey();
        }
    }
}

以上两个示例分别实现了将代理输出到文件和使用代理访问百度两个功能。读者可以根据自己的实际需求进行相应的修改和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#批量抓取免费代理并且验证有效性的实战教程 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#中Socket通信用法实例详解

    C#中Socket通信用法实例详解 1. 简介 本文将详细讲解 C#中 Socket 通信的用法以及实例。Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信。在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信,可以方便地实现 TCP、UDP 等协议。 2. 实例1:C#…

    C# 2023年6月3日
    00
  • 如何让C#、VB.NET实现复杂的二进制操作

    让我先给出这个攻略的大纲: 引言 要解决的问题 C#和VB.NET实现二进制操作的基础知识 通过位运算实现的示例 通过位图操作实现的示例 总结 1. 引言 在使用C#或VB.NET编程时,我们难免需要进行一些复杂的二进制操作,例如位运算、位图操作等等。本篇攻略就是为了帮助你完整地解决这些问题。 2. 要解决的问题 我们需要解决的问题是,如何在C#或VB.NE…

    C# 2023年6月6日
    00
  • C#动态绘制多条曲线的方法

    下面是详细讲解C#动态绘制多条曲线的方法的完整攻略。 标题 C#动态绘制多条曲线的方法 步骤 1. 准备工作 首先,我们需要在项目中添加Windows.Form控件和Chart控件。同时,需要引用System.Windows.Forms.DataVisualization库。 using System.Windows.Forms.DataVisualizat…

    C# 2023年6月1日
    00
  • asp实现的sha1加密解密代码(和C#兼容)

    下面是详细讲解“ASP实现的SHA1加密解密代码(和C#兼容)”的攻略: 概述 SHA1(Secure Hash Algorithm 1)是一种常用的哈希算法。在ASP中,可以使用VBScript或者JScript来实现SHA1加密解密操作。下面我们就来介绍如何在ASP中实现SHA1加密解密操作,并且使代码与C#兼容。 实现步骤 1. 引入JavaScrip…

    C# 2023年6月7日
    00
  • c#调用c++方法介绍,window api

    C#调用C++方法介绍 简介 C#是一种高级编程语言,而C++是一种中级编程语言,在底层处理方面有着突出的优势。将C++模块集成到C#应用程序中,可以利用C++的性能和底层优势来完成一些高性能任务。在实际应用中,使用C#调用C++模块的场景非常普遍,例如Windows API和某些组件库都是基于C++编写的,但是由于其底层特性和页面优化等方面,利用C#调用C…

    C# 2023年6月7日
    00
  • C# CancellationToken和CancellationTokenSource的用法详解

    C# CancellationToken 和 CancellationTokenSource 用法详解 CancellationToken 和 CancellationTokenSource 是 C# 中用于取消异步操作的机制。本篇攻略将详细讲解这两个类的用法。 CancellationTokenSource CancellationTokenSource …

    C# 2023年5月15日
    00
  • unity AudioSource播放完声音后要执行的函数或条件操作

    Unity AudioSource播放完声音后要执行的函数或条件操作 在Unity中,我们可以使用AudioSource来播放声音。但是有些时候,我们需要在声音播放完毕后执行一些函数或条件操作,例如弹出一个对话框或者播放下一个音频。 下面是关于如何实现在AudioSource播放完声音后执行函数或条件操作的完整攻略。 步骤一:编写脚本 首先,我们需要编写一个…

    C# 2023年6月3日
    00
  • C#字符串数组转换为整形数组的方法

    以下是详细的讲解“C#字符串数组转换为整形数组的方法”的攻略: 方法一:使用循环遍历 首先,我们可以使用for循环遍历字符串数组,然后逐一转换成整型,保存至目标整型数组中。 string[] strArray = {"10", "20", "30"}; int[] intArray = new in…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部