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日

相关文章

  • 为HttpClient开启HTTP/2

    .Net Core在调用其他服务时,调用通常使用HttpClient,而HttpClient默认使用HTTP/1.1 。     配置 HttpClient 以使用 HTTP/2 h2 连接 自 .NET Core 3.0 发布以来, .NET 开发人员可以使用 HttpClient 启用 HTTP/2 。   设置 HTTP/2 的方法 DefaultRe…

    C# 2023年4月28日
    00
  • PowerShell中使用.NET将程序集加入全局程序集缓存

    在PowerShell中使用.NET将程序集加入全局程序集缓存,首先需要使用Add-Type -AssemblyName命令加载程序集,然后使用[System.Reflection.Assembly]::Load()方法将加载的程序集添加至全局程序集缓存中。 以下是完整的步骤: 使用Add-Type -AssemblyName命令加载程序集 Add-Type…

    C# 2023年6月3日
    00
  • C#实现泛型List分组输出元素的方法

    下面是详细讲解“C#实现泛型List分组输出元素的方法”的完整攻略。 1. 题目背景 在 C# 中, 泛型(Generic)是指写代码时不必指定具体的类型,而是在使用时在指定类型。List 是 C# 中常用的泛型集合类型。当我们需要对一个 List 进行分组后输出元素,就需要用到泛型 List 分组的方法。 2. 泛型 List 分组的方法 2.1 Grou…

    C# 2023年6月7日
    00
  • Unity Shader实现水波纹效果

    下面是详细讲解“Unity Shader实现水波纹效果”的完整攻略,共分四个步骤: 1. 编写顶点着色器 在顶点着色器中,我们需要定义一个变量来储存水波的振幅,并将其应用到顶点坐标上。以下是实现水波纹效果的基本顶点着色器代码: Shader "Custom/Water" { Properties { _Amplitude ("A…

    C# 2023年6月3日
    00
  • C#多线程之线程池ThreadPool详解

    C#多线程之线程池ThreadPool详解 简介 线程池是一种使用共享资源(线程)的方式,它在系统中维护着一定数量的线程,在任务到来时将其分配给线程执行,执行完毕后线程归还给线程池,以便其他任务使用。线程池采用的是池化思想,能够避免频繁创建和销毁线程造成的资源浪费,提高程序性能。在C#中,我们可以使用ThreadPool类实现线程池的功能。 线程池的优点 线…

    C# 2023年6月6日
    00
  • 详解三种C#实现数组反转方式

    下面是详解三种C#实现数组反转方式的完整攻略: 概述 数组反转是C#中数组操作的一个重要部分。反转一个数组意味着将其元素的顺序翻转,换言之,最后一个元素变成第一个元素,第一个元素变成最后一个元素,以此类推。在本篇攻略中,我们将介绍三种实现将一个数组反转的C#代码。 方法一:Array.Reverse方法 Array.Reverse方法是C#中反转数组的一个内…

    C# 2023年6月7日
    00
  • 基于.net4.0实现IdentityServer4客户端JWT解密

    针对“基于.net4.0实现IdentityServer4客户端JWT解密”的完整攻略,具体步骤如下: 1.创建新项目 使用Visual Studio创建一个新项目,选择“ASP.NET Web应用程序”模板,创建后选择“Web API”模板,目标框架版本选为“.NET Framework 4.7.2”。创建完成后进入解决方案资源管理器,右键单击项目名称,选…

    C# 2023年6月1日
    00
  • ASP.NET C#生成下拉列表树实现代码

    下面我将详细讲解“ASP.NET C#生成下拉列表树实现代码”的完整攻略。 1. 什么是下拉列表树? 下拉列表树,顾名思义就是下拉列表和树结构的结合体。通俗点说,就是在下拉列表的每一项展开后,可以看到类似树形结构的多级列表。下面是一个简单的下拉列表树的示例: – 第一项 + 子项 1 + 子项 2 – 第二项 + 子项 1 + 子项 2 2. 实现下拉列表树…

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