C#中的Web抓取:避免被阻挡

C# 是一种广泛应用于企业级项目和应用程序的多功能编程语言。它源自 C 系列语言,具有高效和强大的特点,使其成为任何开发人员工具包中不可或缺的一部分。

由于其广泛的应用,C# 提供了大量的工具,使开发人员能够解决复杂的解决方案,网络爬虫也不例外。

在本教程中,我们将带您一步步创建一个简单的网络爬虫,使用 C# 及其用户友好的爬虫库。此外,我们还将揭示一个巧妙的技巧,只需一行代码即可帮助您避免被封锁。准备好了吗?我们开始吧!

以下是文章的目录:

目录

  1. 网络爬虫简介
    • 为什么选择 C# 而不是 C 进行网络爬虫?
  2. 设置您的环境
    • 前提条件
    • 安装库
    • 在 Visual Studio 中创建一个 C# 网络爬虫项目
  3. 使用 C# 进行基本的网络爬虫
    • 发出 HTTP 请求
    • 解析 HTML 内容
    • 高级 HTML 解析
  4. 如何处理爬取的数据
  5. 在网络爬虫中处理 CAPTCHA
    • 集成 CAPTCHA 解决方案
    • CapSolver 示例代码
  6. 结论

1. 网络爬虫简介

网络爬虫是自动从网站提取信息的过程。这可以用于各种目的,包括数据分析、市场研究和竞争情报。然而,许多网站实现了检测和阻止自动爬虫尝试的机制,因此使用复杂的技术来避免被封锁是至关重要的。

为什么选择 C# 而不是 C 进行网络爬虫?

网络爬虫通常涉及与网页元素交互、管理 HTTP 请求以及处理数据提取和解析。虽然 C 是一种强大且高效的语言,但它缺乏使网络爬虫更容易和高效的内置库和现代功能。以下是 C# 更适合网络爬虫的一些原因:

  • 丰富的库:C# 拥有丰富的库,如 HtmlAgilityPack 用于 HTML 解析,Selenium 用于浏览器自动化,这些都简化了爬虫过程。
  • 异步编程:C# 的 async 和 await 关键字允许进行高效的异步操作,这对于同时处理多个网络请求至关重要。
  • 易用性:C# 的语法比 C 更现代和用户友好,使开发过程更快且错误更少。
  • 集成:C# 无缝集成到 .NET 框架中,提供了强大的工具和服务,用于构建强大的应用程序。

是否因为反复无法完全解决恼人的验证码而感到困扰?

通过 Capsolver AI 驱动的自动网络解封技术,体验无缝自动验证码解决方案!

领取您的 优惠码,获取最佳验证码解决方案;CapSolver:WEBS。兑换后,您每次充值将获得额外 5% 的奖励,无限制。

2. 设置您的环境

在我们开始爬取之前,我们需要设置开发环境。以下是设置方法:

前提条件

  • Visual Studio:免费的 Visual Studio 2022 Community 版即可。
  • .NET 6+:任何大于或等于 6 的 LTS 版本都可以。
  • HtmlAgilityPack 库用于 HTML 解析
  • RestSharp 库用于发出 HTTP 请求

在 Visual Studio 中创建一个 C# 网络爬虫项目

在 Visual Studio 中设置项目
  1. 打开 Visual Studio,点击“创建新项目”选项。

  1. 在“创建新项目”窗口中,从下拉列表中选择“C#”选项。指定编程语言后,选择“控制台应用程序”模板,然后点击“下一步”。

  1. 将您的项目命名为 StaticWebScraping,点击“选择”,并选择 .NET 版本。如果您已安装 .NET 6.0,Visual Studio 应该已经为您选择好了。

  1. 点击“创建”按钮初始化您的 C# 网络爬虫项目。Visual Studio 将初始化一个包含 App.cs 文件的 StaticWebScraping 文件夹。这个文件将存储您的 C# 网络爬虫逻辑:
namespace WebScraping {
    public class Program {
        public static void Main() {
            // 爬虫逻辑...
        }
    }
}

现在是时候了解如何在 C# 中构建一个网络爬虫了!

3. 使用 C# 进行基本的网络爬虫

在本节中,我们将创建一个 C# 应用程序,该应用程序向网站发出 HTTP 请求,获取 HTML 内容,并解析它以提取信息。

发出 HTTP 请求

首先,让我们创建一个基本的 C# 应用程序,该应用程序向网站发出 HTTP 请求并获取 HTML 内容。

using System;
using RestSharp;

class Program
{
    static void Main()
    {
        // 创建一个新的 RestClient 实例,目标 URL
        var client = new RestClient("https://www.example.com");
        
        // 创建一个新的 RestRequest 实例,使用 GET 方法
        var request = new RestRequest(Method.GET);
        
        // 执行请求并获取响应
        IRestResponse response = client.Execute(request);

        // 检查请求是否成功
        if (response.IsSuccessful)
        {
            // 打印响应的 HTML 内容
            Console.WriteLine(response.Content);
        }
        else
        {
            Console.WriteLine("获取内容失败");
        }
    }
}

解析 HTML 内容

接下来,我们将使用 HtmlAgilityPack 解析 HTML 内容并提取我们需要的信息。

using HtmlAgilityPack;
using System;
using RestSharp;

class Program
{
    static void Main()
    {
        // 创建一个新的 RestClient 实例,目标 URL
        var client = new RestClient("https://www.example.com");
        
        // 创建一个新的 RestRequest 实例,使用 GET 方法
        var request = new RestRequest(Method.GET);
        
        // 执行请求并获取响应
        IRestResponse response = client.Execute(request);

        // 检查请求是否成功
        if (response.IsSuccessful)
        {
            // 将 HTML 内容加载到 HtmlDocument 中
            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(response.Content);

            // 选择匹配指定 XPath 查询的节点
            var nodes = htmlDoc.DocumentNode.SelectNodes("//h1");
            
            // 遍历选定的节点并打印它们的内文本
            foreach (var node in nodes)
            {
                Console.WriteLine(node.InnerText);
            }
        }
        else
        {
            Console.WriteLine("获取内容失败");
        }
    }
}

高级 HTML 解析

让我们更进一步,从一个示例网站抓取更复杂的数据。假设我们想从一个博客页面抓取文章列表,包括标题和链接。

using HtmlAgilityPack;
using System;
using RestSharp;

class Program
{
    static void Main()
    {
        // 创建一个新的 RestClient 实例,目标 URL
        var client = new RestClient("https://www.example.com/blog");
        
        // 创建一个新的 RestRequest 实例,使用 GET 方法
        var request = new RestRequest(Method.GET);
        
        // 执行请求并获取响应
        IRestResponse response = client.Execute(request);

        // 检查请求是否成功
        if (response.IsSuccessful)
        {
            // 将 HTML 内容加载到 HtmlDocument 中
            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(response.Content);

            // 选择匹配指定 XPath 查询的节点
            var nodes = htmlDoc.DocumentNode.SelectNodes("//div[@class='post']");

            // 遍历选定的节点并提取标题和链接
            foreach (var node in nodes)```csharp
{
    // 遍历选定的节点并提取标题和链接
    foreach (var node in nodes)
    {
        var titleNode = node.SelectSingleNode(".//h2/a");
        var title = titleNode.InnerText;
        var link = titleNode.Attributes["href"].Value;
        
        Console.WriteLine("标题: " + title);
        Console.WriteLine("链接: " + link);
        Console.WriteLine();
    }
}
else
{
    Console.WriteLine("获取内容失败");
}
}
}

在这个示例中,我们抓取了一个博客页面,选择每篇文章的标题和链接。XPath 查询 //div[@class='post'] 用于定位单独的帖子。

4. 如何处理爬取的数据

  1. 将其存储在数据库中,以便随时查询。
  2. 将其转换为 JSON 格式,并用它调用各种 API。
  3. 将其转换为人类可读的格式,如 CSV,可以用 Excel 打开。

这些只是一些示例。关键点是,一旦您在代码中获取了爬取的数据,您可以根据需要使用它。通常,爬取的数据会被转换为更有用的格式,以便您的市场、数据分析或销售团队使用。

然而,请记住,网络爬虫也有其挑战。

5. 在网络爬虫中处理 CAPTCHA

网络爬虫面临的最大挑战之一是处理 CAPTCHA,它们旨在区分人类用户和机器人。如果您遇到 CAPTCHA,您的爬虫脚本需要解决它才能继续。特别是如果您想扩大您的网络爬虫规模,CapSolver 可以通过其高准确率和快速解决的能力帮助您解决任何遇到的 CAPTCHA。

集成 CAPTCHA 解决方案

有几种 CAPTCHA 解决服务可以集成到您的爬虫脚本中。这里,我们将使用 CapSolver 服务。首先,您需要注册 CapSolver 并获取您的 API 密钥。

步骤 1:注册 CapSolver

在您准备好使用 CapSolver 的服务之前,您需要前往用户面板并注册您的账户。

步骤 2:获取您的 API 密钥

注册后,您可以从主页面板获取您的 API 密钥。

CapSolver 示例代码

在您的网络爬虫或自动化项目中使用 CapSolver 非常简单。以下是一个 Python 示例,演示如何将 CapSolver 集成到您的工作流程中:

# pip install requests
import requests
import time

# TODO: 设置您的配置
api_key = "YOUR_API_KEY"  # 您的 CapSolver API 密钥
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"  # 目标网站的站点密钥
site_url = ""  # 目标网站的页面 URL

def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'ReCaptchaV2TaskProxyLess',
            "websiteKey": site_key,
            "websiteURL": site_url
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("创建任务失败:", res.text)
        return
    print(f"获取任务 ID: {task_id} / 获取结果中...")

    while True:
        time.sleep(3)  # 延迟
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("解决失败!响应:", res.text)
            return

token = capsolver()
print(token)

在这个示例中,capsolver 函数向 CapSolver 的 API 发送请求,包含必要的参数,并返回 CAPTCHA 解决方案。这个简单的集成可以在网络爬虫和自动化任务中节省无数的时间和精力。

6. 结论

使用 C# 进行网络爬虫使开发人员能够高效地自动从网站提取数据。通过利用 HtmlAgilityPack 和 RestSharp 等库,以及 CAPTCHA 解决服务如 CapSolver,开发人员可以顺利地浏览网页、解析 HTML 内容,并处理各种挑战。这种能力不仅简化了数据收集过程,还确保了遵守道德爬虫实践,提高了网络爬虫项目在各种应用中的可靠性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/699574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis之工作原理,简单CRUD,一篇让你明白原理

一、MyBatis之工作原理 MyBatis是一个半自动映射框架。所谓半自动,是相对Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系。 我们知道,jdbc有四个核心对象 (1)DriverManager,用于注…

OpenCV多版本安装Ubuntu18.04

文章目录 一、查看已安装的Opencv版本二、安装新版本三、多版本OpenCV切换 OpenCV 官网 在此 一、查看已安装的Opencv版本 查看已安装opencv的版本 pkg-config opencv --modversion官网下载对应的版本,并解压 opencv3.4.3 二、安装新版本 进入前置准备里下载…

架构设计-跨域问题的根源及解决方式

前面文章《架构设计-web项目中跨域问题涉及到的后端和前端配置》中说明了处理跨域问题的一种方式,本文详细说明下产生跨域问题的原因及处理方式。 一、产生跨域问题的原因: 浏览器的同源策略:这是跨域问题的根本原因。同源策略是浏览器对Jav…

计算机网络(1) OSI七层模型与TCP/IP四层模型

一.OSI七层模型 OSI 七层模型是国际标准化组织ISO提出的一个网络分层模型,它的目的是使各种不同的计算机和网络在世界范围内按照相同的标准框架实现互联。OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、…

力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)

LeetCode:394. 字符串解码 本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。 不过我们也可以利用括号匹配的方式使用栈进行处理。 1、递归 定义递归函数string GetString(string & s,int & i); 表示处理处理整个numbe…

SQL进阶day12——空值处理

1 统计有未完成状态的试卷的未完成数和未完成率 (复习if的用法) 我的思路: select exam_idm count(if submit_time is NULL then 1 else 0 end) incomplete_cnt, count(if submit_time is NULL then 1 else 0 end)/count(submit_time) comp…

政务云参考技术架构

行业优势 总体架构 政务云平台技术框架图,由机房环境、基础设施层、支撑软件层及业务应用层组成,在运维、安全和运营体系的保障下,为政务云使用单位提供统一服务支撑。 功能架构 标准双区隔离 参照国家电子政务规范,打造符合标准的…

【C++课程学习】:Data类的实现

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍩1.头文件 🍩2.实现文件: 🍩3.分析: &…

力扣40. 组合总和 II

Problem: 40. 组合总和 II 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建一个 res 变量存储所有满足条件的组合结果,使用 track 变量记录当前的组合路径,使用 trackSum 变量记录当前路径中元素的和。 2.排序: 对 candidates 数组进…

第7章 用户输入和 while 循环

第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …

renren-fast-vue在mac上的运行

被这个折磨好久了,终于成功了。。 版本号-node-14 需要提前执行的命令,希望可以帮助到大家。分别是解决版本在mac m1架构上的不兼容问题,另外解决没有验证码的问题,要注意数据库的配置,账号密码是否正确。 npm inst…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…

【DBA早下班系列】—— 并行SQL/慢SQL 问题该如何高效收集诊断信息

1. 前言 OceanBase论坛问答区或者提交工单支持的时候大部分时间都浪费在了诊断信息的获取交互上,今天我就其中大家比较头疼的SQL问题,给大家讲解一下如何一键收集并行SQL/慢SQL所需要的诊断信息,减少沟通成本,让大家早下班。 2. …

course-nlp——4-regex

本文参考自https://github.com/fastai/course-nlp 正则表达式 在本课中,我们将学习 NLP 工具包中的一个有用工具:正则表达式。 让我们考虑两个激励性的例子: 电话号码问题 假设我们得到了一些包含电话号码的数据: 123-456-7890…

记录项目打包时候找不到本地仓库的依赖的解决方法

进入本地仓库对应jar的目录 删除_remote_reposotories文件即可

Photoshop界面介绍

Adobe Photoshop 2024版(通称“Photoshop 2024”或简写为“PS 2024”)下载方式【点我获取下载链接】 百度网盘下载https://pan.baidu.com/s/1JmuK8RMHt2Yyb7NFtgO2uQ?pwdSIMS Photoshop界面介绍 Photoshop,简称PS,是Adobe …

【MySQL】存储引擎

https://www.bilibili.com/video/BV1Kr4y1i7ru?p64 https://jimhackking.github.io/%E8%BF%90%E7%BB%B4/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#more MySQL体系结构: 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证…

【代码随想录】【算法训练营】【第35天】 [1005]K次取反后最大化的数组和 [134]加油站 [135]分发糖果

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 35,连休两天~ 题目详情 [1005] K次取反后最大化的数组和 题目描述 1005 K次取反后最大化的数组和 解题思路 前提:数组 思路:优先负数取反,未…

利用AI机器学习,助力发动机舱电磁场强仿真,轻松实现快速预测

当下工业仿真面临的难题? 在使用 Altair Feko 进行空间场强计算时,每次查询新坐标点的场强幅值都需要重新进行计算,这不仅耗时(约20-30分钟),而且还需要考虑高级算力的排队时间。这种效率瓶颈严重限制了快速…

springboot三层架构与MVC,以及三层架构入门

三层架构与MVC 1. 三层架构是什么 把各个功能模块划分为表示层,业务逻辑层,和数据访问层三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(model)作为数据传递的载体,不同的对象模型…