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日

相关文章

  • 如何在Asp.Net Core中集成Refit

    Asp.Net Core中集成Refit攻略 Refit是一个开源的RESTful API客户端库,它可以帮助我们轻松地使用C#来访问Web API。在Asp.Net Core中,我们可以使用Refit来简化Web API的调用。本攻略将介绍如何在Asp.Net Core中集成Refit。 步骤 以下是在Asp.Net Core中集成Refit的步骤: 安装…

    C# 2023年5月17日
    00
  • 解析错误富文本json字符串(带双引号)的快速解决方法

    下面是“解析错误富文本json字符串(带双引号)的快速解决方法”的攻略: 1. 理解问题 当我们在从 API 或其他数据源中获取 JSON 数据时,有时可能会遇到带有富文本的 JSON 字符串,例如: { "id": 1, "title": "文章标题", "content": …

    C# 2023年5月15日
    00
  • C#之set与get方法的用法案例

    C#之set与get方法的用法案例 什么是set和get方法 set和get方法是面向对象编程中的两个方法,例如在C#中,每个类都可以有自己的属性,通过set和get方法来访问和修改这些属性。 set方法用于设置属性的值。 get方法用于获取属性的值。 set方法的使用 假设有一个名为Person的类,包含了姓名和年龄两个属性: class Person {…

    C# 2023年6月7日
    00
  • ASP.NET MVC重写RazorViewEngine实现多主题切换

    ASP.NET MVC框架提供了Razor视图引擎来生成HTML响应。Razor视图引擎自带的主题设置局限较大,无法实现灵活的UI主题切换。本攻略将介绍如何重写RazorViewEngine以支持多主题切换。 准备工作 创建一个名为“Themes”的文件夹,用于保存所有主题的模板文件。 创建名为ThemeViewEngine.cs的自定义视图引擎,并重写Ra…

    C# 2023年5月31日
    00
  • ASP.NET Core基础之请求处理管道

    ASP.NET Core基础之请求处理管道 在 ASP.NET Core 中,请求处理管道是一个非常重要的组件,它负责处理 HTTP 请求并生成 HTTP 响应。本攻略将详细介绍 ASP.NET Core 的请求处理管道。 请求处理管道的作用 ASP.NET Core 的请求处理管道负责处理 HTTP 请求并生成 HTTP 响应。请求处理管道可以帮助我们: …

    C# 2023年5月16日
    00
  • ASP.NET MVC4异步聊天室的示例代码

    下面是详细讲解“ASP.NET MVC4异步聊天室的示例代码”的完整攻略: 1. 背景介绍 ASP.NET MVC4异步聊天室是一个基于MVC模式的网页聊天室,可以实现多个用户之间的在线聊天。MVC架构分为模型层、视图层和控制器层,异步聊天室的核心在于采用SignalR框架进行实时通信。 2. 程序设计 2.1 模型层 模型层主要实现用户的消息传输,包括输入…

    C# 2023年5月31日
    00
  • C++学习之Lambda表达式的用法详解

    C++学习之Lambda表达式的用法详解 在本文中,我们将详细介绍C++中Lambda表达式的用法和使用场景。 什么是Lambda表达式? Lambda表达式是一种在C++11标准中引入的新功能,它允许我们将一个函数作为一个变量来使用。Lambda表达式相当于一种无名函数,可以在需要的时候定义,并且和普通函数一样具有函数的特性,包括参数、返回值、局部变量等。…

    C# 2023年6月8日
    00
  • C#特性 扩展方法

    C#特性:扩展方法 C#中的扩展方法是一种特殊的静态方法,它们可以像实例方法一样使用,但不需要通过类的实例来调用。扩展方法可以为已有类型添加新的方法,这些方法不需要修改原始类型的定义。 扩展方法使用using关键字引用包含这些方法的静态类。 定义扩展方法 定义一个扩展方法需要满足如下条件: 它必须在一个静态类中。 它必须是一个静态方法。 必须第一个参数是要扩…

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