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

yizhihongxing

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#控制键盘按键的常用方法

    C#控制键盘按键的常用方法 C#是一种通用的、面向对象的编程语言,常用于开发Windows应用程序。在Windows应用程序中,控制键盘按键是非常常见的操作,因此掌握C#控制键盘按键的常用方法是非常必要的。 本文将介绍几种控制键盘按键的常用方法,包括SendKeys类、keybd_event函数和InputSimulator类。 使用SendKeys类 Se…

    C# 2023年6月1日
    00
  • C#中使用资源的方法分析

    C#中使用资源的方法可以帮助我们在应用程序中管理和访问各种资源,包括图标、图片、音频、文本等。以下是使用资源的一些方法分析和攻略。 准备工作 在使用C#中的资源之前,我们需要做以下准备工作: 在项目中添加一个新的资源文件。可以通过右键单击项目名称,选择“添加” -> “新建项” -> “资源文件”来创建一个新资源文件。 向资源文件中添加需要使用的…

    C# 2023年6月1日
    00
  • .net的socket异步通讯示例分享

    下面我将为您详细讲解“.NET的Socket异步通讯示例分享”的攻略。 一、什么是Socket异步通讯 在计算机网络中,Socket(套接字)是指一个可以收发信息的网络通信端点,常用于客户端与服务器之间的通信。异步通讯是指通讯双方在任何时候都可以独立地发送和接收消息,不需要等待对方的响应。 在.NET中,可以使用Socket类实现Socket异步通讯,它提供…

    C# 2023年5月31日
    00
  • C# Environment.Exit()方法: 终止当前进程并返回指定的退出代码

    Environment.Exit() 是C#的内置方法,作用是直接终止当前进程,不管程序是否正常执行结束。 它的使用方法如下所示: Environment.Exit(exitCode); 其中 exitCode 是一个整数,作为程序的退出代码。如果没有提供退出代码,则默认为0。 下面我们来看两个实例: 程序如果不满足某个特定的条件,就直接退出: int nu…

    C# 2023年4月19日
    00
  • Unity实现鼠标双击与长按的检测

    下面是Unity实现鼠标双击与长按的检测的完整攻略。 检测鼠标双击 要在Unity中检测鼠标双击,可以使用以下步骤: 在需要检测双击的对象上添加组件EventSystem; 在需要检测双击的对象上添加组件InputField; 通过代码实现鼠标双击的检测。 以下是一个简单的示例代码,实现了在鼠标双击时输出一段提示信息: public class Double…

    C# 2023年6月3日
    00
  • C#基础知识之GetType与typeof的区别小结

    下面为您详细讲解“C#基础知识之GetType与typeof的区别小结”的攻略。 1. GetType方法 GetType方法是C#中的一个对象方法,返回对象的实际类型。它位于System.Object类中,并且可以被所有派生自System.Object的类调用。 1.1 语法格式 public Type GetType(); 1.2 返回值 GetType…

    C# 2023年6月7日
    00
  • C# 正则表达式经典分类整理集合手册第1/3页

    C# 正则表达式经典分类整理集合手册 简介 C# 正则表达式是在.NET Framework类库中提供的一种字符串检索、匹配和替换的强大工具。该工具可以有效地处理文本数据,支持多种字符串操作方式,并且可以应用于多种编程环境中。 但是,因为 C# 正则表达式具有复杂的语法和规则,很容易让初学者在使用中遇到各种问题。为方便使用,本文融合了多种实际应用经验,以分类…

    C# 2023年6月6日
    00
  • C/C++函数的调用约定的使用

    C/C++中的函数实现和调用都是基于特定的调用约定。调用约定定义了函数参数传递和返回值的方式,以确保不同模块间的函数调用操作的相互兼容性,是编译器与操作系统中必须共同遵循的一组规则。 常见的调用约定包括stdcall、cdecl、fastcall、thiscall和vectorcall。其中,stdcall和cdecl是最常用的调用约定。下面就以两条具体的例…

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