使用 C# 抓取購物網站數據
學習如何使用 C# 與 WebScraper 框架從購物網站中刮取商品分類與項目,從 HTML 元素中抽取結構化資料至自訂模型中。 這份全面的指南將教您如何使用 IronWebScraper 函式庫建立一個強大的電子商務刮刀。
快速入門:使用 C# 搜刮購物網站。
立即開始使用 NuGet 建立 PDF 檔案:
使用 NuGet 套件管理器安裝 IronWebScraper
複製並運行這段程式碼。
using IronWebScraper; public class QuickShoppingScraper : WebScraper { public override void Init() { // Apply your license key License.LicenseKey = "YOUR-LICENSE-KEY"; // Set the starting URL this.Request("https://shopping-site.com", Parse); } public override void Parse(Response response) { // Extract product data foreach (var product in response.Css(".product-item")) { var item = new { Name = product.Css(".product-name").First().InnerText, Price = product.Css(".price").First().InnerText, Image = product.Css("img").First().Attributes["src"] }; Scrape(item, "products.jsonl"); } } } // Run the scraper var scraper = new QuickShoppingScraper(); scraper.Start();部署到您的生產環境進行測試
1.建立一個新的 Console App 專案,命名為 "ShoppingSiteSample"。 2.新增一個繼承自 WebScraper 的"ShoppingScraper"類別。 3.為 Category 和 Product 資料建立模型 4.覆蓋 Init() 以設定起始 URL 和 Parse() 方法進行刮擦 5.執行 scraper 將類別和產品擷取至 JSONL 檔案
如何分析購物網站的 HTML 結構? 選擇一個購物網站來分析其內容結構。 了解 HTML 結構對於成功的網頁掃描至關重要。 在撰寫任何程式碼之前,請花時間使用瀏覽器開發工具分析目標網站的結構。
如圖所示,左側欄包含網站產品類別的連結。 第一步是調查網站的 HTML 並規劃 scraping 方法。 此分析階段對於建立有效的搜刮策略至關重要。為什麼了解 HTML 結構很重要? 時尚網站的類別下有子類別(男裝、女裝、童裝)。 瞭解此層級結構有助於設計適當的資料模型和搜刮邏輯。 當使用 [ 進階的網頁搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)時,正確的 HTML 分析變得更加重要。 ```html
如何設定 Web Scraping 專案? 按照 [C# Web scraping](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp/) 的最佳實務建立專案。 1.建立一個新的控制台應用程式,或為範例新增一個名為 "ShoppingSiteSample" 的資料夾。 2.新增一個名為 "ShoppingScraper" 的類別 3.從搜尋網站類別及其子類別開始 4.透過 NuGet 套件管理員或套件管理員控制台安裝 `IronWebScraper` : ```csharp Install-Package IronWebScraper ```我應該為分類使用何種資料模型? 建立分類模型,以正確表示所發現的層級結構: ```csharp public class Category { ////// Gets or sets the name. /// ////// The name. /// public string Name { get; set; } ////// Gets or sets the URL. /// ////// The URL. /// public string URL { get; set; } ////// Gets or sets the subcategories. /// ////// The subcategories. /// public ListSubCategories { get; set; } // Additional properties for enhanced data collection public int ProductCount { get; set; } public DateTime LastScraped { get; set; } public string CategoryType { get; set; } } ```如何建立基本的 Scraper 邏輯? 建立 scraper 邏輯,記得在執行 scraper 之前[套用您的授權金鑰](https://ironsoftware.com/csharp/webscraper/get-started/license-keys/): ```csharp public class ShoppingScraper : WebScraper { ////// Initialize the web scraper, setting the start URLs and allowed/banned domains or URL patterns. /// public override void Init() { // Apply your license key - get one from https://ironsoftware.com/csharp/webscraper/licensing/ License.LicenseKey = "LicenseKey"; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; // Configure request settings for better performance this.Request("www.webSite.com", Parse); } ////// Parses the HTML document of the response to scrap the necessary data. /// ///The HTTP Response object to parse.public override void Parse(Response response) { var categoryList = new List(); // Iterate through each link in the menu and extract the category data. foreach (var Links in response.Css("#menuFixed > ul > li > a")) { var cat = new Category { URL = Links.Attributes["href"], Name = Links.InnerText, LastScraped = DateTime.Now }; categoryList.Add(cat); } // Save the scraped data into a JSONL file. Scrape(categoryList, "Shopping.jsonl"); } } ```我的目標是選單中的哪些元素? 從選單中抓取連結需要精確的 CSS 選擇器。 [API 參考](https://ironsoftware.com/csharp/webscraper/object-reference/api/)提供有關可用選擇器方法的詳細資訊:
如何同時抓取主類別和子類別? 更新程式碼,以搜刮主要類別和所有子連結。 此方法可確保完整的導覽結構捕捉: ```csharp public override void Parse(Response response) { // List of Category Links (Root) var categoryList = new List(); // Traverse each 'li' under the fixed menu foreach (var li in response.Css("#menuFixed > ul > li")) { // List of Main Links foreach (var Links in li.Css("a")) { var cat = new Category { URL = Links.Attributes["href"], Name = Links.InnerText, SubCategories = new List(), LastScraped = DateTime.Now }; // List of Subcategories Links foreach (var subCategory in li.Css("a[class=subcategory]")) { var subcat = new Category { URL = subCategory.Attributes["href"], Name = subCategory.InnerText, CategoryType = "Subcategory" }; // Check if subcategory link already exists if (cat.SubCategories.Find(c => c.Name == subcat.Name && c.URL == subcat.URL) == null) { // Add sublinks cat.SubCategories.Add(subcat); } } // Update product count based on subcategories cat.ProductCount = cat.SubCategories.Count; // Add Main Category to the list categoryList.Add(cat); } } // Save the scraped data into a JSONL file. Scrape(categoryList, "Shopping.jsonl"); } ```如何從分類頁面中萃取產品資訊? 有了所有網站類別的連結,就可以開始搜尋每個類別中的產品。 在處理產品頁面時,[線程安全](https://ironsoftware.com/csharp/webscraper/troubleshooting/thread-safety/)對於最佳效能變得非常重要。 導覽到任何類別並檢查內容:
產品的 HTML 架構是什麼樣子? 檢視 HTML 結構以瞭解產品組織: ```html ```我應該建立哪個產品模型? 為此內容建立產品模型。 在使用 [ 購物網站 scraping](https://ironsoftware.com/csharp/webscraper/how-to/scraping-from-a-shopping-website/) 工作時,請擷取所有相關產品的詳細資訊: ```csharp public class Product { ////// Gets or sets the name. /// ////// The name. /// public string Name { get; set; } ////// Gets or sets the price. /// ////// The price. /// public string Price { get; set; } ////// Gets or sets the image. /// ////// The image. /// public string Image { get; set; } // Additional properties for comprehensive data collection public string Brand { get; set; } public string OldPrice { get; set; } public string Discount { get; set; } public float Rating { get; set; } public int ReviewCount { get; set; } public ListAvailableSizes { get; set; } public string ProductUrl { get; set; } public string SKU { get; set; } public DateTime ScrapedDate { get; set; } } ```如何新增產品搜尋功能? 要 scrape 類別頁面,請新增具有錯誤處理和資料驗證功能的 scrape 方法: ```csharp public void ParseCategory(Response response) { // List of Products var productList = new List(); // Iterate through product links in the product section foreach (var Links in response.Css("section.products > div > a")) { try { var product = new Product { Name = Links.Css("h2.title > span.name").First().InnerText, Brand = Links.Css("h2.title > span.brand").FirstOrDefault()?.InnerText ?? "Unknown", Price = Links.Css("div.price-container > span.price-box > span.price > span[data-price]").First().InnerText, Image = Links.Css("div.image-wrapper.default-state > img").First().Attributes["src"], ProductUrl = Links.Attributes["href"], SKU = Links.ParentNode.Attributes["data-sku"], ScrapedDate = DateTime.Now }; // Extract old price if available var oldPriceElement = Links.Css("span.price.-old > span[data-price]").FirstOrDefault(); if (oldPriceElement != null) { product.OldPrice = oldPriceElement.InnerText; } // Extract discount percentage var discountElement = Links.Css("span.sale-flag-percent").FirstOrDefault(); if (discountElement != null) { product.Discount = discountElement.InnerText; } // Extract rating information var ratingWidth = Links.Css("div.stars").FirstOrDefault()?.Attributes["style"]; if (!string.IsNullOrEmpty(ratingWidth)) { var width = System.Text.RegularExpressions.Regex.Match(ratingWidth, @"(\d+)%").Groups[1].Value; if (int.TryParse(width, out int ratingPercent)) { product.Rating = ratingPercent / 20.0f; // Convert percentage to 5-star scale } } // Extract review count var reviewText = Links.Css("div.total-ratings").FirstOrDefault()?.InnerText; if (!string.IsNullOrEmpty(reviewText)) { var reviewCount = System.Text.RegularExpressions.Regex.Match(reviewText, @"\d+").Value; if (int.TryParse(reviewCount, out int count)) { product.ReviewCount = count; } } // Extract available sizes product.AvailableSizes = Links.Css("div.list.-sizes > span.sku-size") .Select(s => s.InnerText) .ToList(); productList.Add(product); } catch (Exception ex) { // Log error and continue with next product Console.WriteLine($"Error parsing product: {ex.Message}"); } } // Save the scraped product data into a JSONL file. Scrape(productList, "Products.jsonl"); // Handle pagination if needed var nextPageLink = response.Css("a.pagination-next").FirstOrDefault(); if (nextPageLink != null) { var nextPageUrl = nextPageLink.Attributes["href"]; this.Request(nextPageUrl, ParseCategory); } } ``` 這種全面的搜刮購物網站方法可確保擷取所有相關的產品資訊,同時優雅地處理錯誤。 如需更進階的使用情境,請探索 [`IronWebScraper`中提供的進階網路搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)。
如何建立基本的 Scraper 邏輯? 建立 scraper 邏輯,記得在執行 scraper 之前[套用您的授權金鑰](https://ironsoftware.com/csharp/webscraper/get-started/license-keys/): ```csharp public class ShoppingScraper : WebScraper { ////// Initialize the web scraper, setting the start URLs and allowed/banned domains or URL patterns. /// public override void Init() { // Apply your license key - get one from https://ironsoftware.com/csharp/webscraper/licensing/ License.LicenseKey = "LicenseKey"; this.LoggingLevel = WebScraper.LogLevel.All; this.WorkingDirectory = AppSetting.GetAppRoot() + @"\ShoppingSiteSample\Output\"; // Configure request settings for better performance this.Request("www.webSite.com", Parse); } ////// Parses the HTML document of the response to scrap the necessary data. /// ///The HTTP Response object to parse.public override void Parse(Response response) { var categoryList = new List(); // Iterate through each link in the menu and extract the category data. foreach (var Links in response.Css("#menuFixed > ul > li > a")) { var cat = new Category { URL = Links.Attributes["href"], Name = Links.InnerText, LastScraped = DateTime.Now }; categoryList.Add(cat); } // Save the scraped data into a JSONL file. Scrape(categoryList, "Shopping.jsonl"); } } ```我的目標是選單中的哪些元素? 從選單中抓取連結需要精確的 CSS 選擇器。 [API 參考](https://ironsoftware.com/csharp/webscraper/object-reference/api/)提供有關可用選擇器方法的詳細資訊:
如何同時抓取主類別和子類別? 更新程式碼,以搜刮主要類別和所有子連結。 此方法可確保完整的導覽結構捕捉: ```csharp public override void Parse(Response response) { // List of Category Links (Root) var categoryList = new List(); // Traverse each 'li' under the fixed menu foreach (var li in response.Css("#menuFixed > ul > li")) { // List of Main Links foreach (var Links in li.Css("a")) { var cat = new Category { URL = Links.Attributes["href"], Name = Links.InnerText, SubCategories = new List(), LastScraped = DateTime.Now }; // List of Subcategories Links foreach (var subCategory in li.Css("a[class=subcategory]")) { var subcat = new Category { URL = subCategory.Attributes["href"], Name = subCategory.InnerText, CategoryType = "Subcategory" }; // Check if subcategory link already exists if (cat.SubCategories.Find(c => c.Name == subcat.Name && c.URL == subcat.URL) == null) { // Add sublinks cat.SubCategories.Add(subcat); } } // Update product count based on subcategories cat.ProductCount = cat.SubCategories.Count; // Add Main Category to the list categoryList.Add(cat); } } // Save the scraped data into a JSONL file. Scrape(categoryList, "Shopping.jsonl"); } ```如何從分類頁面中萃取產品資訊? 有了所有網站類別的連結,就可以開始搜尋每個類別中的產品。 在處理產品頁面時,[線程安全](https://ironsoftware.com/csharp/webscraper/troubleshooting/thread-safety/)對於最佳效能變得非常重要。 導覽到任何類別並檢查內容:
產品的 HTML 架構是什麼樣子? 檢視 HTML 結構以瞭解產品組織: ```html ```我應該建立哪個產品模型? 為此內容建立產品模型。 在使用 [ 購物網站 scraping](https://ironsoftware.com/csharp/webscraper/how-to/scraping-from-a-shopping-website/) 工作時,請擷取所有相關產品的詳細資訊: ```csharp public class Product { ////// Gets or sets the name. /// ////// The name. /// public string Name { get; set; } ////// Gets or sets the price. /// ////// The price. /// public string Price { get; set; } ////// Gets or sets the image. /// ////// The image. /// public string Image { get; set; } // Additional properties for comprehensive data collection public string Brand { get; set; } public string OldPrice { get; set; } public string Discount { get; set; } public float Rating { get; set; } public int ReviewCount { get; set; } public ListAvailableSizes { get; set; } public string ProductUrl { get; set; } public string SKU { get; set; } public DateTime ScrapedDate { get; set; } } ```如何新增產品搜尋功能? 要 scrape 類別頁面,請新增具有錯誤處理和資料驗證功能的 scrape 方法: ```csharp public void ParseCategory(Response response) { // List of Products var productList = new List(); // Iterate through product links in the product section foreach (var Links in response.Css("section.products > div > a")) { try { var product = new Product { Name = Links.Css("h2.title > span.name").First().InnerText, Brand = Links.Css("h2.title > span.brand").FirstOrDefault()?.InnerText ?? "Unknown", Price = Links.Css("div.price-container > span.price-box > span.price > span[data-price]").First().InnerText, Image = Links.Css("div.image-wrapper.default-state > img").First().Attributes["src"], ProductUrl = Links.Attributes["href"], SKU = Links.ParentNode.Attributes["data-sku"], ScrapedDate = DateTime.Now }; // Extract old price if available var oldPriceElement = Links.Css("span.price.-old > span[data-price]").FirstOrDefault(); if (oldPriceElement != null) { product.OldPrice = oldPriceElement.InnerText; } // Extract discount percentage var discountElement = Links.Css("span.sale-flag-percent").FirstOrDefault(); if (discountElement != null) { product.Discount = discountElement.InnerText; } // Extract rating information var ratingWidth = Links.Css("div.stars").FirstOrDefault()?.Attributes["style"]; if (!string.IsNullOrEmpty(ratingWidth)) { var width = System.Text.RegularExpressions.Regex.Match(ratingWidth, @"(\d+)%").Groups[1].Value; if (int.TryParse(width, out int ratingPercent)) { product.Rating = ratingPercent / 20.0f; // Convert percentage to 5-star scale } } // Extract review count var reviewText = Links.Css("div.total-ratings").FirstOrDefault()?.InnerText; if (!string.IsNullOrEmpty(reviewText)) { var reviewCount = System.Text.RegularExpressions.Regex.Match(reviewText, @"\d+").Value; if (int.TryParse(reviewCount, out int count)) { product.ReviewCount = count; } } // Extract available sizes product.AvailableSizes = Links.Css("div.list.-sizes > span.sku-size") .Select(s => s.InnerText) .ToList(); productList.Add(product); } catch (Exception ex) { // Log error and continue with next product Console.WriteLine($"Error parsing product: {ex.Message}"); } } // Save the scraped product data into a JSONL file. Scrape(productList, "Products.jsonl"); // Handle pagination if needed var nextPageLink = response.Css("a.pagination-next").FirstOrDefault(); if (nextPageLink != null) { var nextPageUrl = nextPageLink.Attributes["href"]; this.Request(nextPageUrl, ParseCategory); } } ``` 這種全面的搜刮購物網站方法可確保擷取所有相關的產品資訊,同時優雅地處理錯誤。 如需更進階的使用情境,請探索 [`IronWebScraper`中提供的進階網路搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)。
我的目標是選單中的哪些元素? 從選單中抓取連結需要精確的 CSS 選擇器。 [API 參考](https://ironsoftware.com/csharp/webscraper/object-reference/api/)提供有關可用選擇器方法的詳細資訊:
如何同時抓取主類別和子類別? 更新程式碼,以搜刮主要類別和所有子連結。 此方法可確保完整的導覽結構捕捉: ```csharp public override void Parse(Response response) { // List of Category Links (Root) var categoryList = new List(); // Traverse each 'li' under the fixed menu foreach (var li in response.Css("#menuFixed > ul > li")) { // List of Main Links foreach (var Links in li.Css("a")) { var cat = new Category { URL = Links.Attributes["href"], Name = Links.InnerText, SubCategories = new List(), LastScraped = DateTime.Now }; // List of Subcategories Links foreach (var subCategory in li.Css("a[class=subcategory]")) { var subcat = new Category { URL = subCategory.Attributes["href"], Name = subCategory.InnerText, CategoryType = "Subcategory" }; // Check if subcategory link already exists if (cat.SubCategories.Find(c => c.Name == subcat.Name && c.URL == subcat.URL) == null) { // Add sublinks cat.SubCategories.Add(subcat); } } // Update product count based on subcategories cat.ProductCount = cat.SubCategories.Count; // Add Main Category to the list categoryList.Add(cat); } } // Save the scraped data into a JSONL file. Scrape(categoryList, "Shopping.jsonl"); } ```如何從分類頁面中萃取產品資訊? 有了所有網站類別的連結,就可以開始搜尋每個類別中的產品。 在處理產品頁面時,[線程安全](https://ironsoftware.com/csharp/webscraper/troubleshooting/thread-safety/)對於最佳效能變得非常重要。 導覽到任何類別並檢查內容:
產品的 HTML 架構是什麼樣子? 檢視 HTML 結構以瞭解產品組織: ```html ```我應該建立哪個產品模型? 為此內容建立產品模型。 在使用 [ 購物網站 scraping](https://ironsoftware.com/csharp/webscraper/how-to/scraping-from-a-shopping-website/) 工作時,請擷取所有相關產品的詳細資訊: ```csharp public class Product { ////// Gets or sets the name. /// ////// The name. /// public string Name { get; set; } ////// Gets or sets the price. /// ////// The price. /// public string Price { get; set; } ////// Gets or sets the image. /// ////// The image. /// public string Image { get; set; } // Additional properties for comprehensive data collection public string Brand { get; set; } public string OldPrice { get; set; } public string Discount { get; set; } public float Rating { get; set; } public int ReviewCount { get; set; } public ListAvailableSizes { get; set; } public string ProductUrl { get; set; } public string SKU { get; set; } public DateTime ScrapedDate { get; set; } } ```如何新增產品搜尋功能? 要 scrape 類別頁面,請新增具有錯誤處理和資料驗證功能的 scrape 方法: ```csharp public void ParseCategory(Response response) { // List of Products var productList = new List(); // Iterate through product links in the product section foreach (var Links in response.Css("section.products > div > a")) { try { var product = new Product { Name = Links.Css("h2.title > span.name").First().InnerText, Brand = Links.Css("h2.title > span.brand").FirstOrDefault()?.InnerText ?? "Unknown", Price = Links.Css("div.price-container > span.price-box > span.price > span[data-price]").First().InnerText, Image = Links.Css("div.image-wrapper.default-state > img").First().Attributes["src"], ProductUrl = Links.Attributes["href"], SKU = Links.ParentNode.Attributes["data-sku"], ScrapedDate = DateTime.Now }; // Extract old price if available var oldPriceElement = Links.Css("span.price.-old > span[data-price]").FirstOrDefault(); if (oldPriceElement != null) { product.OldPrice = oldPriceElement.InnerText; } // Extract discount percentage var discountElement = Links.Css("span.sale-flag-percent").FirstOrDefault(); if (discountElement != null) { product.Discount = discountElement.InnerText; } // Extract rating information var ratingWidth = Links.Css("div.stars").FirstOrDefault()?.Attributes["style"]; if (!string.IsNullOrEmpty(ratingWidth)) { var width = System.Text.RegularExpressions.Regex.Match(ratingWidth, @"(\d+)%").Groups[1].Value; if (int.TryParse(width, out int ratingPercent)) { product.Rating = ratingPercent / 20.0f; // Convert percentage to 5-star scale } } // Extract review count var reviewText = Links.Css("div.total-ratings").FirstOrDefault()?.InnerText; if (!string.IsNullOrEmpty(reviewText)) { var reviewCount = System.Text.RegularExpressions.Regex.Match(reviewText, @"\d+").Value; if (int.TryParse(reviewCount, out int count)) { product.ReviewCount = count; } } // Extract available sizes product.AvailableSizes = Links.Css("div.list.-sizes > span.sku-size") .Select(s => s.InnerText) .ToList(); productList.Add(product); } catch (Exception ex) { // Log error and continue with next product Console.WriteLine($"Error parsing product: {ex.Message}"); } } // Save the scraped product data into a JSONL file. Scrape(productList, "Products.jsonl"); // Handle pagination if needed var nextPageLink = response.Css("a.pagination-next").FirstOrDefault(); if (nextPageLink != null) { var nextPageUrl = nextPageLink.Attributes["href"]; this.Request(nextPageUrl, ParseCategory); } } ``` 這種全面的搜刮購物網站方法可確保擷取所有相關的產品資訊,同時優雅地處理錯誤。 如需更進階的使用情境,請探索 [`IronWebScraper`中提供的進階網路搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)。
如何從分類頁面中萃取產品資訊? 有了所有網站類別的連結,就可以開始搜尋每個類別中的產品。 在處理產品頁面時,[線程安全](https://ironsoftware.com/csharp/webscraper/troubleshooting/thread-safety/)對於最佳效能變得非常重要。 導覽到任何類別並檢查內容:
產品的 HTML 架構是什麼樣子? 檢視 HTML 結構以瞭解產品組織: ```html ```我應該建立哪個產品模型? 為此內容建立產品模型。 在使用 [ 購物網站 scraping](https://ironsoftware.com/csharp/webscraper/how-to/scraping-from-a-shopping-website/) 工作時,請擷取所有相關產品的詳細資訊: ```csharp public class Product { ////// Gets or sets the name. /// ////// The name. /// public string Name { get; set; } ////// Gets or sets the price. /// ////// The price. /// public string Price { get; set; } ////// Gets or sets the image. /// ////// The image. /// public string Image { get; set; } // Additional properties for comprehensive data collection public string Brand { get; set; } public string OldPrice { get; set; } public string Discount { get; set; } public float Rating { get; set; } public int ReviewCount { get; set; } public ListAvailableSizes { get; set; } public string ProductUrl { get; set; } public string SKU { get; set; } public DateTime ScrapedDate { get; set; } } ```如何新增產品搜尋功能? 要 scrape 類別頁面,請新增具有錯誤處理和資料驗證功能的 scrape 方法: ```csharp public void ParseCategory(Response response) { // List of Products var productList = new List(); // Iterate through product links in the product section foreach (var Links in response.Css("section.products > div > a")) { try { var product = new Product { Name = Links.Css("h2.title > span.name").First().InnerText, Brand = Links.Css("h2.title > span.brand").FirstOrDefault()?.InnerText ?? "Unknown", Price = Links.Css("div.price-container > span.price-box > span.price > span[data-price]").First().InnerText, Image = Links.Css("div.image-wrapper.default-state > img").First().Attributes["src"], ProductUrl = Links.Attributes["href"], SKU = Links.ParentNode.Attributes["data-sku"], ScrapedDate = DateTime.Now }; // Extract old price if available var oldPriceElement = Links.Css("span.price.-old > span[data-price]").FirstOrDefault(); if (oldPriceElement != null) { product.OldPrice = oldPriceElement.InnerText; } // Extract discount percentage var discountElement = Links.Css("span.sale-flag-percent").FirstOrDefault(); if (discountElement != null) { product.Discount = discountElement.InnerText; } // Extract rating information var ratingWidth = Links.Css("div.stars").FirstOrDefault()?.Attributes["style"]; if (!string.IsNullOrEmpty(ratingWidth)) { var width = System.Text.RegularExpressions.Regex.Match(ratingWidth, @"(\d+)%").Groups[1].Value; if (int.TryParse(width, out int ratingPercent)) { product.Rating = ratingPercent / 20.0f; // Convert percentage to 5-star scale } } // Extract review count var reviewText = Links.Css("div.total-ratings").FirstOrDefault()?.InnerText; if (!string.IsNullOrEmpty(reviewText)) { var reviewCount = System.Text.RegularExpressions.Regex.Match(reviewText, @"\d+").Value; if (int.TryParse(reviewCount, out int count)) { product.ReviewCount = count; } } // Extract available sizes product.AvailableSizes = Links.Css("div.list.-sizes > span.sku-size") .Select(s => s.InnerText) .ToList(); productList.Add(product); } catch (Exception ex) { // Log error and continue with next product Console.WriteLine($"Error parsing product: {ex.Message}"); } } // Save the scraped product data into a JSONL file. Scrape(productList, "Products.jsonl"); // Handle pagination if needed var nextPageLink = response.Css("a.pagination-next").FirstOrDefault(); if (nextPageLink != null) { var nextPageUrl = nextPageLink.Attributes["href"]; this.Request(nextPageUrl, ParseCategory); } } ``` 這種全面的搜刮購物網站方法可確保擷取所有相關的產品資訊,同時優雅地處理錯誤。 如需更進階的使用情境,請探索 [`IronWebScraper`中提供的進階網路搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)。
如何新增產品搜尋功能? 要 scrape 類別頁面,請新增具有錯誤處理和資料驗證功能的 scrape 方法: ```csharp public void ParseCategory(Response response) { // List of Products var productList = new List(); // Iterate through product links in the product section foreach (var Links in response.Css("section.products > div > a")) { try { var product = new Product { Name = Links.Css("h2.title > span.name").First().InnerText, Brand = Links.Css("h2.title > span.brand").FirstOrDefault()?.InnerText ?? "Unknown", Price = Links.Css("div.price-container > span.price-box > span.price > span[data-price]").First().InnerText, Image = Links.Css("div.image-wrapper.default-state > img").First().Attributes["src"], ProductUrl = Links.Attributes["href"], SKU = Links.ParentNode.Attributes["data-sku"], ScrapedDate = DateTime.Now }; // Extract old price if available var oldPriceElement = Links.Css("span.price.-old > span[data-price]").FirstOrDefault(); if (oldPriceElement != null) { product.OldPrice = oldPriceElement.InnerText; } // Extract discount percentage var discountElement = Links.Css("span.sale-flag-percent").FirstOrDefault(); if (discountElement != null) { product.Discount = discountElement.InnerText; } // Extract rating information var ratingWidth = Links.Css("div.stars").FirstOrDefault()?.Attributes["style"]; if (!string.IsNullOrEmpty(ratingWidth)) { var width = System.Text.RegularExpressions.Regex.Match(ratingWidth, @"(\d+)%").Groups[1].Value; if (int.TryParse(width, out int ratingPercent)) { product.Rating = ratingPercent / 20.0f; // Convert percentage to 5-star scale } } // Extract review count var reviewText = Links.Css("div.total-ratings").FirstOrDefault()?.InnerText; if (!string.IsNullOrEmpty(reviewText)) { var reviewCount = System.Text.RegularExpressions.Regex.Match(reviewText, @"\d+").Value; if (int.TryParse(reviewCount, out int count)) { product.ReviewCount = count; } } // Extract available sizes product.AvailableSizes = Links.Css("div.list.-sizes > span.sku-size") .Select(s => s.InnerText) .ToList(); productList.Add(product); } catch (Exception ex) { // Log error and continue with next product Console.WriteLine($"Error parsing product: {ex.Message}"); } } // Save the scraped product data into a JSONL file. Scrape(productList, "Products.jsonl"); // Handle pagination if needed var nextPageLink = response.Css("a.pagination-next").FirstOrDefault(); if (nextPageLink != null) { var nextPageUrl = nextPageLink.Attributes["href"]; this.Request(nextPageUrl, ParseCategory); } } ``` 這種全面的搜刮購物網站方法可確保擷取所有相關的產品資訊,同時優雅地處理錯誤。 如需更進階的使用情境,請探索 [`IronWebScraper`中提供的進階網路搜刮功能](https://ironsoftware.com/csharp/webscraper/tutorials/webscraping-in-c-sharp-advanced/)。
常見問題解答
如何使用 C# 從購物網站擷取產品資料?
IronWebScraper 可利用 CSS 選擇器,輕鬆地從購物網站中擷取產品資料。您可以建立一個 WebScraper 類別,覆寫 Parse 方法,並使用 response.Css() 來針對特定的 HTML 元素,例如產品名稱、價格和圖片。擷取的資料可以儲存為各種格式,包括 JSON 和 JSONL 檔案。
建立購物網站 scraper 的基本步驟是什麼?
使用 IronWebScraper 創建購物網站刮刀:1) 建立 Console App 專案;2) 新增繼承自 WebScraper 的類別;3) 建立類別和產品的資料模型;4) 重覆 Init() 方法以設定您的起始 URL;5) 重覆 Parse() 方法以使用 CSS 選擇器擷取資料;以及 6) 執行 scraper 以將資料儲存為您偏好的格式。
在搜刮電子商務網站時,我該如何處理層級分類結構?
IronWebScraper 可讓您透過建立適當的資料模型,反映父子關係 (如時裝 > 男裝 > 鞋子),以處理層級結構。您可以使用 CSS 選擇器瀏覽嵌套的 HTML 元素,並以程式化方式建立分類樹狀結構,這在使用 IronWebScraper 的進階功能時特別有用。
在刮除之前,分析購物網站 HTML 結構的最佳方法是什麼?
在使用 IronWebScraper 搜刮購物網站之前,請使用瀏覽器開發工具檢查 HTML 結構。在 CSS 類別和元素階層中尋找一致的模式。此分析可幫助您找出要在 IronWebScraper Parse() 方法中使用的正確 CSS 選擇器,以便準確定位產品資訊、類別和其他資料元素。
我可以從同一個頁面中抽取產品清單和類別導覽嗎?
是的,IronWebScraper 使您能夠從單一頁面中提取多種類型的資料。在您的 Parse() 方法中,您可以使用不同的 CSS 選擇器同時針對類別連結 (如 '.category-item「)和產品清單 (如 」.product-item'),然後將它們儲存到不同的輸出檔案或資料結構中。
如何將擷取的產品資料儲存至檔案?
IronWebScraper 提供內建的 Scrape() 方法,可自動儲存擷取的資料。只需傳送您的資料物件和檔案名稱至 Scrape(item, "products.jsonl")。該函式庫支援多種輸出格式,包括 JSON、JSONL 和 CSV,讓您可以輕鬆匯出刮除的電子商務資料作進一步處理。












