How to Scrape Data from Websites in C

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronWebscraper 是一個用於網頁抓取、網頁資料擷取和網頁內容解析的 .NET函式庫。 這是一個易於使用的庫,可以添加到 Microsoft Visual Studio 專案中,用於開發和生產。

IronWebscraper 具有許多獨特的功能和特性,例如控制允許和禁止的頁面、物件、媒體等。它還允許管理多個身分、Web 快取以及許多其他功能,我們將在本教程中介紹這些功能。

開始使用 IronWebscraper

立即開始在您的項目中使用 IronWebScraper 並免費試用。

第一步:
green arrow pointer


目標受眾

本教學課程針對具有基本或進階程式設計技能的軟體開發人員,他們希望建立和實現進階抓取功能(網站抓取、網站資料收集和提取、網站內容解析、網頁採集)的解決方案。

網頁抓取圖片

所需技能

  1. 具備基本的程式設計知識,熟練使用微軟程式語言之一,例如 C# 或 VB.NET .NET
  2. 對 Web 技術(HTML、 JavaScript、jQuery、CSS 等)及其運作原理有基本的了解
  3. 具備 DOM、XPath、HTML 和 CSS 選擇器的基本知識

工具

  1. Microsoft Visual Studio 2010 或更高版本
  2. 適用於瀏覽器的 Web 開發人員擴充程序,例如 Chrome 的 Web Inspector 或 Firefox 的 Firebug。

為什麼要刮? (Reasons and Concepts)

如果您想打造一款具備以下功能的產品或解決方案:

  1. 提取網站數據
  2. 從多個網站比較內容、價格、功能等
  3. 掃描和快取網站內容

如果您有上述一個或多個原因,那麼 IronWebscraper 就是一個非常適合您需求的函式庫。

如何安裝 IronWebScraper?

建立新專案後(請參閱附錄 A),您可以透過NuGet自動插入程式庫或手動安裝 DLL 將 IronWebScraper 程式庫新增至您的專案。

使用NuGet安裝

要使用NuGet將 IronWebScraper 庫添加到我們的專案中,我們可以使用視覺化介面(NuGet套件管理器)或透過套件管理器控制台的命令來完成。

使用NuGet套件管理器

  1. 使用滑鼠 -> 右鍵點選專案名稱 -> 選擇"管理NuGet套件"
  2. 從瀏覽標籤頁 -> 搜尋 IronWebScraper -> 安裝
  3. 點選"確定"
  4. 完畢

使用NuGet程式包控制台

  1. 從"工具"-> "NuGet套件管理器"->"套件管理器控制台"
  2. 選擇類別庫項目作為預設項目
  3. 執行指令 -> Install-Package IronWebScraper

手動安裝

  1. 前往https://ironsoftware.com
  2. 點選 IronWebScraper 或直接使用 URL 造訪其頁面。https://ironsoftware.com/csharp/webscraper/
  3. 點選下載 DLL。
  4. 解壓縮下載的壓縮文件
  5. 在 Visual Studio 中,以滑鼠右鍵按一下專案 -> 新增 -> 引用 -> 瀏覽

    使用 DLL 加入 IronWebscraper

  6. 前往解壓縮後的資料夾 -> netstandard2.0 -> 並選擇所有 .dll 文件

    使用 DLL 加入 IronWebscraper 2

  7. 完成了!

HelloScraper - 我們的第一個 IronWebScraper 範例

像往常一樣,我們將首先實現 Hello Scraper 應用程序,並邁出使用 IronWebScraper 的第一步。

  • 我們建立了一個名為"IronWebScraperSample"的新控制台應用程式。

建立 IronWebScraper 範例的步驟

  1. 建立一個名為"HelloScraperSample"的資料夾
  2. 然後新增一個新類,並將其命名為"HelloScraper"。
    HelloScraper 新增類別

  3. 將此程式碼片段加入 HelloScraper 中

    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    public class HelloScraper : WebScraper
    {
        /// <summary>
        /// Override this method to initialize your web scraper.
        /// Important tasks will be to request at least one start URL and set allowed/banned domain or URL patterns.
        /// </summary>
        public override void Init()
        {
            License.LicenseKey = "LicenseKey"; // Write License Key
            this.LoggingLevel = WebScraper.LogLevel.All; // Log all events
            this.Request("https://blog.scrapinghub.com", Parse); // Initialize a web request to the given URL
        }
    
        /// <summary>
        /// Override this method to create the default Response handler for your web scraper.
        /// If you have multiple page types, you can add additional similar methods.
        /// </summary>
        /// <param name="response">The HTTP Response object to parse</param>
        public override void Parse(Response response)
        {
            // Set working directory for the project
            this.WorkingDirectory = AppSetting.GetAppRoot() + @"\HelloScraperSample\Output\";
            // Loop on all links
            foreach (var titleLink in response.Css("h2.entry-title a"))
            {
                // Read link text
                string title = titleLink.TextContentClean;
                // Save result to file
                Scrape(new ScrapedData() { { "Title", title } }, "HelloScraper.json");
            }
    
            // Loop on all links for pagination
            if (response.CssExists("div.prev-post > a[href]"))
            {
                // Get next page URL
                var nextPage = response.Css("div.prev-post > a[href]")[0].Attributes["href"];
                // Scrape next URL
                this.Request(nextPage, Parse);
            }
        }
    }
    $vbLabelText   $csharpLabel
  4. 現在開始抓取數據,請將此程式碼片段加入 Main 檔案。

    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    static void Main(string[] args)
    {
        // Create Object From Hello Scrape class
        HelloScraperSample.HelloScraper scrape = new HelloScraperSample.HelloScraper();
        // Start Scraping
        scrape.Start();
    }
    $vbLabelText   $csharpLabel
  5. 結果將以 WebScraper.WorkingDirectory/classname.Json 的格式儲存到檔案中。
    HelloScraper 結果

程式碼概述

Scrape.Start() 觸發如下抓取邏輯:

  1. 呼叫 Init() 方法來初始化變數、抓取屬性和行為屬性。
  2. Init() 中的起始頁面請求設定為 Request("https://blog.scrapinghub.com", Parse)
  3. 並行處理多個 HTTP 請求和線程,保持程式碼同步,更易於偵錯。
  4. Parse() 方法在 Init() 之後觸發,用於處理回應,使用 CSS 選擇器提取資料並將其儲存為 JSON 格式。

IronWebScraper 函式庫函數與選項

更新後的文件包含在使用手動安裝方法下載的 zip 檔案中(IronWebScraper Documentation.chm File),或者您也可以查看庫的線上文件以取得最新更新。https://ironsoftware.com/csharp/webscraper/object-reference/

要開始在您的專案中使用 IronWebScraper,您必須繼承 IronWebScraper.WebScraper 類,該類別擴展了您的類別庫並為其添加了抓取功能。 另外,您必須實作 Init()Parse(Response response) 方法。

namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
namespace IronWebScraperEngine
{
    public class NewsScraper : IronWebScraper.WebScraper
    {
        public override void Init()
        {
            throw new NotImplementedException();
        }

        public override void Parse(Response response)
        {
            throw new NotImplementedException();
        }
    }
}
$vbLabelText   $csharpLabel
屬性\函數 類型 描述
Init () 方法 用於設定刮刀
Parse (Response response) 方法 用於實作爬蟲程式將使用的邏輯以及它將如何處理資料。 可以針對不同的頁面行為或結構實作多種方法。
BannedUrls, AllowedUrls, BannedDomains 收藏 用於禁止/允許存取網址和/或網域名稱。 例如:BannedUrls.Add("*.zip", "*.exe", "*.gz", "*.pdf"); 支援通配符和正規表示式。
ObeyRobotsDotTxt 布林值 用於啟用或停用讀取和遵循 robots.txt 中的指令。
ObeyRobotsDotTxtForHost (string Host) 方法 用於啟用或停用對特定網域的 robots.txt 中的指令的讀取和遵循。
Scrape, ScrapeUnique 方法
ThrottleMode 列舉 枚舉選項:ByDomainHostName。 實現智慧請求限制,尊重主機 IP 位址或網域主機名稱。
EnableWebCache, EnableWebCache (TimeSpan cacheDuration) 方法 啟用網頁請求快取。
MaxHttpConnectionLimit 國際 設定允許開啟的 HTTP 請求(線程)總數。
RateLimitPerHost 時間跨度 設定向給定網域或 IP 位址發出請求之間的最小禮貌延遲(暫停)。
OpenConnectionLimitPerHost 國際 設定每個主機名稱或 IP 位址允許的並發 HTTP 請求(執行緒)數量。
WorkingDirectory 細繩 設定用於儲存資料的工作目錄路徑。

真實案例與實踐

抓取線上電影網站

讓我們舉個例子,來抓取一個電影網站的資料。

新增一個類別並將其命名為 MovieScraper:

新增 MovieScraper 類別

HTML結構

這是我們在網站首頁看到的HTML程式碼的一部分:

<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
    <div data-movie-id="20746" class="ml-item">
        <a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
                  src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
        </a>
    </div>
    <div data-movie-id="20724" class="ml-item">
        <a href="https://website.com/film/snatched-20724/" >
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 class="lazy thumb mli-thumb" alt="Snatched" 
                 src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>Snatched</h2></span>
        </a>
    </div>
</div>
<div id="movie-featured" class="movies-list movies-list-full tab-pane in fade active">
    <div data-movie-id="20746" class="ml-item">
        <a href="https://website.com/film/king-arthur-legend-of-the-sword-20746/">
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 class="lazy thumb mli-thumb" alt="King Arthur: Legend of the Sword"
                  src="https://img.gocdn.online/2017/05/16/poster/2116d6719c710eabe83b377463230fbe-king-arthur-legend-of-the-sword.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>King Arthur: Legend of the Sword</h2></span>
        </a>
    </div>
    <div data-movie-id="20724" class="ml-item">
        <a href="https://website.com/film/snatched-20724/" >
            <span class="mli-quality">CAM</span>
            <img data-original="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 class="lazy thumb mli-thumb" alt="Snatched" 
                 src="https://img.gocdn.online/2017/05/16/poster/5ef66403dc331009bdb5aa37cfe819ba-snatched.jpg" 
                 style="display: inline-block;">
            <span class="mli-info"><h2>Snatched</h2></span>
        </a>
    </div>
</div>
HTML

我們可以看到,我們有電影 ID、標題和指向詳細頁面的連結。 讓我們開始抓取這些資料:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("www.website.com", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movieId = div.GetAttribute("data-movie-id");
                var link = div.Css("a")[0];
                var movieTitle = link.TextContentClean;
                Scrape(new ScrapedData() { { "MovieId", movieId }, { "MovieTitle", movieTitle } }, "Movie.Jsonl");
            }
        }           
    }
}
$vbLabelText   $csharpLabel

結構化電影課程

為了保存格式化後的數據,我們來實作一個電影類別:

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
}
public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
}
$vbLabelText   $csharpLabel

現在更新我們的程式碼,使用 Movie 類別:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://website.com/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                Scrape(movie, "Movie.Jsonl");
            }
        }
    }
}
$vbLabelText   $csharpLabel

詳細頁面抓取

讓我們擴展 Movie 類,添加新的屬性來顯示詳細資訊:

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
    public string Description { get; set; }
    public List<string> Genre { get; set; }
    public List<string> Actor { get; set; }
}
public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string URL { get; set; }
    public string Description { get; set; }
    public List<string> Genre { get; set; }
    public List<string> Actor { get; set; }
}
$vbLabelText   $csharpLabel

然後導航到詳細資訊頁面,使用 IronWebScraper 的擴充功能進行抓取:

public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
public class MovieScraper : WebScraper
{
    public override void Init()
    {
        License.LicenseKey = "LicenseKey";
        this.LoggingLevel = WebScraper.LogLevel.All;
        this.WorkingDirectory = AppSetting.GetAppRoot() + @"\MovieSample\Output\";
        this.Request("https://domain/", Parse);
    }

    public override void Parse(Response response)
    {
        foreach (var div in response.Css("#movie-featured > div"))
        {
            if (div.GetAttribute("class") != "clearfix")
            {
                var movie = new Movie
                {
                    Id = Convert.ToInt32(div.GetAttribute("data-movie-id")),
                    Title = div.Css("a")[0].TextContentClean,
                    URL = div.Css("a")[0].Attributes["href"]
                };
                this.Request(movie.URL, ParseDetails, new MetaData() { { "movie", movie } });
            }
        }           
    }

    public void ParseDetails(Response response)
    {
        var movie = response.MetaData.Get<Movie>("movie");
        var div = response.Css("div.mvic-desc")[0];
        movie.Description = div.Css("div.desc")[0].TextContentClean;
        movie.Genre = div.Css("div > p > a").Select(element => element.TextContentClean).ToList();
        movie.Actor = div.Css("div > p:nth-child(2) > a").Select(element => element.TextContentClean).ToList();

        Scrape(movie, "Movie.Jsonl");
    }
}
$vbLabelText   $csharpLabel

IronWebScraper 庫功能

HttpIdentity 功能

某些系統要求使用者登入才能查看內容; 使用 HttpIdentity 作為憑證:

HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
HttpIdentity id = new HttpIdentity
{
    NetworkUsername = "username",
    NetworkPassword = "pwd"
};
Identities.Add(id);
$vbLabelText   $csharpLabel

啟用 Web 快取

快取請求的頁面以便在開發過程中重複使用:

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    EnableWebCache();
    this.Request("http://www.WebSite.com", Parse);
}
$vbLabelText   $csharpLabel

節流

控制連線數和速度:

public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
public override void Init()
{
    License.LicenseKey = "LicenseKey";
    this.LoggingLevel = WebScraper.LogLevel.All;
    this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\";
    this.MaxHttpConnectionLimit = 80;
    this.RateLimitPerHost = TimeSpan.FromMilliseconds(50);
    this.OpenConnectionLimitPerHost = 25;
    this.ObeyRobotsDotTxt = false;
    this.ThrottleMode = Throttle.ByDomainHostName;
    this.Request("https://www.Website.com", Parse);
}
$vbLabelText   $csharpLabel

節流特性

  • MaxHttpConnectionLimit
    允許開啟的 HTTP 請求(線程)總數
  • RateLimitPerHost
    向特定網域名稱或 IP 位址發出請求之間最小禮貌延遲(暫停)
  • OpenConnectionLimitPerHost
    每個主機名稱或 IP 位址允許的並發 HTTP 請求(線程)數量
  • ThrottleMode
    讓 WebSraper 不僅能根據主機名,還能根據主機伺服器的 IP 位址智慧地限制請求。 如果多個被抓取的網域託管在同一台機器上,這樣做比較有禮貌。

附錄

如何建立 Windows 窗體應用程式?

請使用 Visual Studio 2013 或更高版本。

  1. 開啟 Visual Studio。
  2. 文件 -> 新建 -> 項目
    Enterprise 2015

  3. 選擇 View C# 或 VB -> Windows -> Windows 窗體應用程式。
    建立 Windows 應用程式

項目名稱:IronScraperSample
位置:選擇磁碟上的一個位置。

如何建立ASP.NET Web 窗體應用程式?

  1. 開啟 Visual Studio。
    Enterprise 2015

  2. 文件 -> 新建 -> 項目
    新建專案

  3. 選擇 View C# 或 VB -> Web -> ASP.NET Web 應用程式 (.NET Framework)。
     .NET Web 應用程式

項目名稱:IronScraperSample
位置:選擇磁碟上的一個位置。

  1. 從您的ASP.NET範本中,選擇一個空白範本並選取"Web 表單"。
     .NET模板

  2. 您的基本ASP.NET Web 表單專案已建立完成。
     .NET Web 表單項目

點擊此處下載完整的教學範例專案程式碼

常見問題解答

如何在 C# 中從網站抓取數據?

您可以使用 IronWebScraper 來在 C# 中從網站抓取數據。首先通過 NuGet 安裝該庫並設置一個基本的控制台應用程序以有效地開始提取網路數據。

C# 網路爬蟲的先決條件是什麼?

要在 C# 中執行網路爬蟲,您應具備 C# 或 VB.NET 的基本編程技能,並了解 HTML、JavaScript 和 CSS 等網路技術,還需熟悉 DOM、XPath 和 CSS 選擇器。

如何在 .NET 項目中安裝網路爬蟲庫?

要在 .NET 項目中安裝 IronWebScraper,可使用 NuGet 封裝管理器控制台命令 Install-Package IronWebScraper,或在 Visual Studio 中瀏覽 NuGet 封裝管理器界面。

如何在我的網路爬蟲中實現請求限制?

IronWebScraper 可讓您實現請求限制來管理向伺服器發出的請求頻率。這可以通過 MaxHttpConnectionLimitRateLimitPerHostOpenConnectionLimitPerHost 等設置進行配置。

開啟網路緩存在網路爬蟲中的目的是什麼?

開啟網路緩存可以通過存儲和重用先前的響應來減少向伺服器發送的請求數。這可以在 IronWebScraper 中使用 EnableWebCache 方法進行設置。

在網頁抓取中如何處理身份驗證?

使用 IronWebScraper,您可以使用 HttpIdentity 來管理身份驗證,以便進入登錄表單或受限區域後面的內容,從而可以抓取受保護的資源。

C# 網路爬蟲的簡單範例是什麼?

教程中提供的 'HelloScraper' 是一個簡單範例,演示了使用 IronWebScraper 設置基本網路爬蟲,包括如何發起請求和解析響應。

如何擴展我的網路爬蟲以處理複雜的頁面結構?

使用 IronWebScraper,您可以通過自定義 Parse 方法來擴展您的爬蟲以處理複雜的頁面結構,允許靈活的數據提取策略。

使用網路爬蟲庫有什麼好處?

使用像 IronWebScraper 這樣的網路爬蟲庫具有許多優勢,例如簡化數據提取、域管理、請求限制、緩存和支持身份驗證,從而使網路爬蟲任務更高效。

Darrius Serrant
全棧軟件工程師 (WebOps)

Darrius Serrant 擁有邁阿密大學計算機科學學士學位,目前任職於 Iron Software 的全栈 WebOps 市場營銷工程師。從小就迷上編碼,他認為計算既神秘又可接近,是創意和解決問題的完美媒介。

在 Iron Software,Darrius 喜歡創造新事物,並簡化複雜概念以便於理解。作為我們的駐場開發者之一,他也自願教學生,分享他的專業知識給下一代。

對 Darrius 來說,工作令人滿意因為它被重視且有實際影響。

準備好開始了嗎?
Nuget 下載 131,860 | 版本: 2026.3 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package IronWebScraper
執行範例 觀看您的目標網站成為結構化資料。