如何使用 C# 從網站抓取數據
IronWebscraper 是一個用於網頁抓取、網頁資料擷取和網頁內容解析的 .NET 函式庫。 這是一個易於使用的庫,可以添加到 Microsoft Visual Studio 專案中,用於開發和生產。
IronWebscraper 具有許多獨特的功能和特性,例如控制允許和禁止的頁面、物件、媒體等。它還允許管理多個身分、Web 快取以及許多其他功能,我們將在本教程中介紹這些功能。
開始使用 IronWebscraper
!{--01001100010010010100001001010010010000010101001001011001010111110101001101010100010001010101010 10100010111110101010001010010010010010100000101001100010111110100001001001100010011111010000100100110001001111010101
目標受眾
本教學課程針對具有基本或進階程式設計技能的軟體開發人員,他們希望建立和實現進階抓取功能(網站抓取、網站資料收集和提取、網站內容解析、網頁採集)的解決方案。
所需技能
1.具備使用微軟程式語言(如 C# 或 VB.NET)的基本程式設計技巧 2.基本瞭解網路技術(HTML、JavaScript、JQuery、CSS 等)及其運作方式
- 具備 DOM、XPath、HTML 和 CSS 選擇器的基本知識
工具
1.Microsoft Visual Studio 2010 或以上
- 適用於瀏覽器的 Web 開發人員擴充程序,例如 Chrome 的 Web Inspector 或 Firefox 的 Firebug。
為什麼要刮? (Reasons and Concepts)
如果您想打造一款具備以下功能的產品或解決方案:
1.擷取網站資料 2.比較多個網站的內容、價格、功能等
- 掃描和快取網站內容
如果您有上述一個或多個原因,那麼 IronWebscraper 就是一個非常適合您需求的函式庫。
如何安裝 IronWebScraper?
建立新專案後(請參閱附錄 A),您可以透過 NuGet 自動插入程式庫或手動安裝 DLL 將 IronWebScraper 程式庫新增至您的專案。
使用 NuGet 安裝
要使用 NuGet 將 IronWebScraper 庫添加到我們的專案中,我們可以使用視覺化介面(NuGet 套件管理器)或使用套件管理器控制台的命令來完成此操作。
使用 NuGet 套件管理器
1.使用滑鼠 -> 在專案名稱上按滑鼠右鍵 -> 選擇管理 NuGet 套件 2.從瀏覽索引標籤 -> 搜尋 IronWebScraper -> 安裝 3.按一下確定
- 完畢
使用 NuGet 套件控制台
1.從工具 -> NuGet 套件管理員 -> 套件管理員控制台 2.選擇類別庫專案為預設專案
- 運行命令 ->
Install-Package IronWebScraper
手動安裝
1.前往 https://ironsoftware.com 2.點選 IronWebScraper 或使用 URL https://ironsoftware.com/csharp/webscraper/ 直接造訪其網頁
點選下載 DLL。
4.擷取下載的壓縮檔 5.在 Visual Studio 中右擊專案 -> 新增 -> 引用 -> 瀏覽
6.前往解壓縮的資料夾 -> netstandard2.0 -> 並選擇所有 .dll 檔案
- 完成了!
HelloScraper - 我們的第一個 IronWebScraper 範例
像往常一樣,我們將首先實現 Hello Scraper 應用程序,並邁出使用 IronWebScraper 的第一步。
- 我們建立了一個名為"IronWebScraperSample"的新控制台應用程式。
建立 IronWebScraper 範例的步驟
1.建立資料夾,並將其命名為 "HelloScraperSample" 2.然後新增一個類別,並將其命名為 "HelloScraper" HelloScraper 添加類
將此程式碼片段加入 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現在開始抓取數據,請將此程式碼片段加入 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()會觸發如下的抓取邏輯:
- 呼叫
Init()方法來初始化變數、抓取屬性和行為屬性。 - 在
Init()中使用Request("https://blog.scrapinghub.com", Parse)設定起始頁面請求。 - 並行處理多個 HTTP 請求和線程,保持程式碼同步,更易於偵錯。
Parse()方法在Init()之後觸發,用於處理回應,使用 CSS 選擇器提取資料並將其儲存為 JSON 格式。
IronWebScraper 函式庫函數與選項
更新的說明文件可以在以手動安裝方式下載的壓縮檔內找到 (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();
}
}
}| 屬性\函數 | 類型 | 描述 |
|---|---|---|
Init () | 方法 | 用於設定刮刀 |
解析 (回應 response) | 方法 | 用於實作爬蟲程式將使用的邏輯以及它將如何處理資料。 可以針對不同的頁面行為或結構實作多種方法。 |
BannedUrls 、 AllowedUrls 、 BannedDomains | 收藏 | 用於禁止/允許存取網址和/或網域名稱。 例如: BannedUrls.Add(" *.zip", "* .exe", " *.gz", "* .pdf");支援萬用字元和正規表示式。 |
| <編碼>ObeyRobotsDotTxt</編碼 | 布林值 | 用於啟用或停用讀取和遵循robots.txt中的指令。 |
ObeyRobotsDotTxtForHost(字串 Host) | 方法 | 用於啟用或停用對特定網域的robots.txt指令的讀取和遵循。 |
Scrape , ScrapeUnique | 方法 | |
節流模式 | 列舉 | 枚舉選項: ByIpAddress 、 ByDomainHostName 。 實現智慧請求限制,尊重主機 IP 位址或網域主機名稱。 |
EnableWebCache , EnableWebCache (TimeSpan cacheDuration) | 方法 | 啟用網頁請求快取。 |
MaxHttpConnectionLimit | 國際 | 設定允許開啟的 HTTP 請求(線程)總數。 |
| <代碼>RateLimitPerHost</代碼 | 時間跨度 | 設定向給定網域或 IP 位址發出請求之間的最小禮貌延遲(暫停)。 |
OpenConnectionLimitPerHost | 國際 | 設定每個主機名稱或 IP 位址允許的並發 HTTP 請求(執行緒)數量。 |
工作目錄 | 細繩 | 設定用於儲存資料的工作目錄路徑。 |
真實案例與實踐
抓取線上電影網站
讓我們建立一個範例,在這個範例中,我們刮取一個電影網站。
新增一個新類別並將其命名為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>我們可以看到,我們有電影 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");
}
}
}
}結構化電影課程
為了保存格式化後的數據,我們來實作一個電影類別:
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; }
}現在更新我們的程式碼,使用 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");
}
}
}
}詳細頁面抓取
讓我們擴充 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; }
}然後導航到詳細資訊頁面,使用 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");
}
}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);啟用 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);
}節流
控制連線數和速度:
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);
}節流特性
MaxHttpConnectionLimit
允許開啟的 HTTP 請求總數 (線程)RateLimitPerHost
向指定網域或 IP 位址請求之間的最小禮貌延遲 (暫停)OpenConnectionLimitPerHost
每個主機名稱或 IP 位址允許的 HTTP 並發請求(線程)數量ThrottleMode
讓 WebSraper 不僅能依據主機名稱,還能依據主機伺服器的 IP 位址,智慧地對請求進行節流。 如果多個被抓取的網域託管在同一台機器上,這樣做比較有禮貌。
附錄
如何建立 Windows 窗體應用程式?
請使用 Visual Studio 2013 或更高版本。
1.開啟 Visual Studio。
2.檔案 -> 新增 -> 專案 
- 選擇 View C# 或 VB -> Windows -> Windows 窗體應用程式。

專案名稱: IronScraperSample 位置:選擇磁碟上的一個位置。
如何建立 ASP.NET Web 窗體應用程式?
1.開啟 Visual Studio。
2.檔案 -> 新增 -> 專案 
- 選擇 View C# 或 VB -> Web -> ASP.NET Web 應用程式 (.NET Framework)。

專案名稱: IronScraperSample 位置:選擇磁碟上的一個位置。
從您的 ASP.NET 範本中,選擇一個空白範本並選取"Web 表單"。

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

常見問題解答
如何使用 C# 從網站抓取資料?
您可以使用 IronWebScraper 從 C# 網站抓取資料。首先透過 NuGet 安裝該庫,然後設定一個基本的控制台應用程序,即可開始有效率地提取網頁資料。
在 C# 中進行網路爬蟲需要哪些先決條件?
要使用 C# 進行網頁爬蟲,您應該具備 C# 或 VB.NET 的基本程式設計技能,了解 HTML、JavaScript 和 CSS 等 Web 技術,並熟悉 DOM、XPath 和 CSS 選擇器。
如何在.NET專案中安裝網路爬蟲庫?
若要在 .NET 專案中安裝 IronWebScraper,可以使用 NuGet 套件管理器控制台,透過指令Install-Package IronWebScraper或透過 Visual Studio 中的 NuGet 套件管理器介面進行操作。
如何在我的網頁爬蟲中實現請求限流?
IronWebScraper 可讓您實現請求節流,以管理向伺服器發出的請求頻率。這可以透過MaxHttpConnectionLimit 、 RateLimitPerHost和OpenConnectionLimitPerHost等設定進行設定。
在網頁抓取中啟用網頁快取的目的是什麼?
在網頁抓取中啟用網頁快取有助於透過儲存和重複使用先前的回應來減少發送到伺服器的請求數量。這可以透過在 IronWebScraper 中使用EnableWebCache方法進行設定。
在網路爬蟲中如何處理身份驗證?
使用 IronWebScraper,您可以利用HttpIdentity來管理身分驗證,從而允許存取登入表單或受限區域後面的內容,進而實現對受保護資源的抓取。
用 C# 寫一個簡單的網路爬蟲範例是什麼?
「HelloScraper」是教程中提供的一個簡單的範例。它示範如何使用IronWebScraper設定一個基本的網頁爬蟲,包括如何發起請求和解析回應。
如何擴展我的網頁爬蟲程式以處理複雜的頁面結構?
使用 IronWebScraper,您可以自訂Parse方法來處理不同的頁面類型,從而擴展您的抓取工具以處理複雜的頁面結構,實現靈活的資料提取策略。
使用網路爬蟲庫有哪些好處?
使用 IronWebScraper 等網路爬蟲庫可以帶來諸多好處,例如簡化資料提取、網域管理、請求限制、快取和身份驗證支持,從而能夠高效地處理網路爬蟲任務。






