IronWebScraper 教程 在 C# 中抓取博客网页 如何使用 C# 抓取博客 Curtis Chau 已更新:六月 10, 2025 下载 IronWebScraper NuGet 下载 DLL 下载 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在双子座打开 向 Gemini 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 This article was translated from English: Does it need improvement? Translated View the article in English 让我们使用Iron WebScraper提取博客内容,使用C#或VB.NET。 本教程展示了如何将WordPress博客(或类似的)重新抓取为内容,使用.NET // Define a class that extends WebScraper from IronWebScraper public class BlogScraper : WebScraper { /// <summary> /// Override this method to initialize your web-scraper. /// Set at least one start URL and configure domain or URL patterns. /// </summary> public override void Init() { // Set your license key for IronWebScraper License.LicenseKey = "YourLicenseKey"; // Enable logging for all actions this.LoggingLevel = WebScraper.LogLevel.All; // Set a directory to store output and cache files this.WorkingDirectory = AppSetting.GetAppRoot() + @"\BlogSample\Output\"; // Enable caching with a specific duration EnableWebCache(new TimeSpan(1, 30, 30)); // Request the start URL and specify the response handler this.Request("http://blogSite.com/", Parse); } } // Define a class that extends WebScraper from IronWebScraper public class BlogScraper : WebScraper { /// <summary> /// Override this method to initialize your web-scraper. /// Set at least one start URL and configure domain or URL patterns. /// </summary> public override void Init() { // Set your license key for IronWebScraper License.LicenseKey = "YourLicenseKey"; // Enable logging for all actions this.LoggingLevel = WebScraper.LogLevel.All; // Set a directory to store output and cache files this.WorkingDirectory = AppSetting.GetAppRoot() + @"\BlogSample\Output\"; // Enable caching with a specific duration EnableWebCache(new TimeSpan(1, 30, 30)); // Request the start URL and specify the response handler this.Request("http://blogSite.com/", Parse); } } ' Define a class that extends WebScraper from IronWebScraper Public Class BlogScraper Inherits WebScraper ''' <summary> ''' Override this method to initialize your web-scraper. ''' Set at least one start URL and configure domain or URL patterns. ''' </summary> Public Overrides Sub Init() ' Set your license key for IronWebScraper License.LicenseKey = "YourLicenseKey" ' Enable logging for all actions Me.LoggingLevel = WebScraper.LogLevel.All ' Set a directory to store output and cache files Me.WorkingDirectory = AppSetting.GetAppRoot() & "\BlogSample\Output\" ' Enable caching with a specific duration EnableWebCache(New TimeSpan(1, 30, 30)) ' Request the start URL and specify the response handler Me.Request("http://blogSite.com/", Parse) End Sub End Class $vbLabelText $csharpLabel 像往常一样,我们创建一个Scraper并继承自WebScraper类。 在这种情况下,它是"BlogScraper"。 我们设置一个工作目录为"\BlogSample\Output\",以便所有的输出和缓存文件都可以存放。 然后我们启用网页缓存,将请求的页面保存到缓存文件夹"WebCache"中。 现在让我们编写一个解析函数: /// <summary> /// Override this method to handle the Http Response for your web scraper. /// Add additional methods if you handle multiple page types. /// </summary> /// <param name="response">The HTTP Response object to parse.</param> public override void Parse(Response response) { // Iterate over each link found in the section navigation foreach (var link in response.Css("div.section-nav > ul > li > a")) { switch(link.TextContentClean) { case "Reviews": { // Handle reviews case } break; case "Science": { // Handle science case } break; default: { // Save the link title to a file Scrape(new ScrapedData() { { "Title", link.TextContentClean } }, "BlogScraper.Jsonl"); } break; } } } /// <summary> /// Override this method to handle the Http Response for your web scraper. /// Add additional methods if you handle multiple page types. /// </summary> /// <param name="response">The HTTP Response object to parse.</param> public override void Parse(Response response) { // Iterate over each link found in the section navigation foreach (var link in response.Css("div.section-nav > ul > li > a")) { switch(link.TextContentClean) { case "Reviews": { // Handle reviews case } break; case "Science": { // Handle science case } break; default: { // Save the link title to a file Scrape(new ScrapedData() { { "Title", link.TextContentClean } }, "BlogScraper.Jsonl"); } break; } } } ''' <summary> ''' Override this method to handle the Http Response for your web scraper. ''' Add additional methods if you handle multiple page types. ''' </summary> ''' <param name="response">The HTTP Response object to parse.</param> Public Overrides Sub Parse(ByVal response As Response) ' Iterate over each link found in the section navigation For Each link In response.Css("div.section-nav > ul > li > a") Select Case link.TextContentClean Case "Reviews" ' Handle reviews case Case "Science" ' Handle science case Case Else ' Save the link title to a file Scrape(New ScrapedData() From { { "Title", link.TextContentClean } }, "BlogScraper.Jsonl") End Select Next link End Sub $vbLabelText $csharpLabel 在Parse方法中,我们从顶部菜单获取所有指向分类页面(电影、科学、评论等)的链接。 然后,我们根据链接类别切换到合适的解析方法。 让我们为科学页面准备我们的对象模型: /// <summary> /// Represents a model for Science Page /// </summary> public class ScienceModel { /// <summary> /// Gets or sets the title. /// </summary> public string Title { get; set; } /// <summary> /// Gets or sets the author. /// </summary> public string Author { get; set; } /// <summary> /// Gets or sets the date. /// </summary> public string Date { get; set; } /// <summary> /// Gets or sets the image. /// </summary> public string Image { get; set; } /// <summary> /// Gets or sets the text. /// </summary> public string Text { get; set; } } /// <summary> /// Represents a model for Science Page /// </summary> public class ScienceModel { /// <summary> /// Gets or sets the title. /// </summary> public string Title { get; set; } /// <summary> /// Gets or sets the author. /// </summary> public string Author { get; set; } /// <summary> /// Gets or sets the date. /// </summary> public string Date { get; set; } /// <summary> /// Gets or sets the image. /// </summary> public string Image { get; set; } /// <summary> /// Gets or sets the text. /// </summary> public string Text { get; set; } } ''' <summary> ''' Represents a model for Science Page ''' </summary> Public Class ScienceModel ''' <summary> ''' Gets or sets the title. ''' </summary> Public Property Title() As String ''' <summary> ''' Gets or sets the author. ''' </summary> Public Property Author() As String ''' <summary> ''' Gets or sets the date. ''' </summary> Public Property [Date]() As String ''' <summary> ''' Gets or sets the image. ''' </summary> Public Property Image() As String ''' <summary> ''' Gets or sets the text. ''' </summary> Public Property Text() As String End Class $vbLabelText $csharpLabel 现在让我们实现一个单页面抓取: /// <summary> /// Parses the reviews from the response. /// </summary> /// <param name="response">The HTTP Response object.</param> public void ParseReviews(Response response) { // A list to hold Science models var scienceList = new List<ScienceModel>(); foreach (var postBox in response.Css("section.main > div > div.post-list")) { var item = new ScienceModel { Title = postBox.Css("h1.headline > a")[0].TextContentClean, Author = postBox.Css("div.author > a")[0].TextContentClean, Date = postBox.Css("div.time > a")[0].TextContentClean, Image = postBox.Css("div.image-wrapper.default-state > img")[0].Attributes["src"], Text = postBox.Css("div.summary > p")[0].TextContentClean }; scienceList.Add(item); } // Save the science list to a JSONL file Scrape(scienceList, "BlogScience.Jsonl"); } /// <summary> /// Parses the reviews from the response. /// </summary> /// <param name="response">The HTTP Response object.</param> public void ParseReviews(Response response) { // A list to hold Science models var scienceList = new List<ScienceModel>(); foreach (var postBox in response.Css("section.main > div > div.post-list")) { var item = new ScienceModel { Title = postBox.Css("h1.headline > a")[0].TextContentClean, Author = postBox.Css("div.author > a")[0].TextContentClean, Date = postBox.Css("div.time > a")[0].TextContentClean, Image = postBox.Css("div.image-wrapper.default-state > img")[0].Attributes["src"], Text = postBox.Css("div.summary > p")[0].TextContentClean }; scienceList.Add(item); } // Save the science list to a JSONL file Scrape(scienceList, "BlogScience.Jsonl"); } ''' <summary> ''' Parses the reviews from the response. ''' </summary> ''' <param name="response">The HTTP Response object.</param> Public Sub ParseReviews(ByVal response As Response) ' A list to hold Science models Dim scienceList = New List(Of ScienceModel)() For Each postBox In response.Css("section.main > div > div.post-list") Dim item = New ScienceModel With { .Title = postBox.Css("h1.headline > a")(0).TextContentClean, .Author = postBox.Css("div.author > a")(0).TextContentClean, .Date = postBox.Css("div.time > a")(0).TextContentClean, .Image = postBox.Css("div.image-wrapper.default-state > img")(0).Attributes("src"), .Text = postBox.Css("div.summary > p")(0).TextContentClean } scienceList.Add(item) Next postBox ' Save the science list to a JSONL file Scrape(scienceList, "BlogScience.Jsonl") End Sub $vbLabelText $csharpLabel 在创建模型后,我们可以解析响应对象,深入挖掘其主要元素(标题、作者、日期、图像、文本)。 然后,我们使用Scrape(object, fileName)将我们的结果保存在一个单独的文件中。 点击这里查看完整的IronWebscraper使用教程 开始使用 IronWebscraper 常见问题解答 如何在 C# 中创建博客网页抓取器? 要在 C# 中创建博客网页抓取器,您可以使用 IronWebScraper 库。首先定义一个扩展 WebScraper 类的类,设置起始 URL,配置抓取器以处理不同的页面类型,并使用 Parse 方法从 HTTP 响应中提取所需信息。 Parse 方法在网页抓取中的作用是什么? 在使用 IronWebScraper 进行网页抓取时,Parse 方法对于处理 HTTP 响应至关重要。它通过解析页面内容、识别链接并分类页面类型(如博客文章或其他部分)来帮助提取数据。 如何高效管理网页抓取数据? IronWebScraper 通过配置缓存来存储请求页面并设置输出文件的工作目录,以提高数据管理效率。这种组织有助于跟踪抓取的数据并减少不必要的页面重新获取。 IronWebScraper 如何帮助抓取 WordPress 博客? IronWebScraper 提供导航博客结构、提取文章详情和处理各种页面类型的工具,从而简化了 WordPress 博客的抓取。您可以使用该库解析标题、作者、日期、图片和文本等信息。 我可以将 IronWebScraper 用于 C# 和 VB.NET 吗? 是的,IronWebScraper 兼容 C# 和 VB.NET,对偏好使用这两种 .NET 语言的开发者来说是一个多用途的选择。 如何处理博客内的不同类型页面? 您可以通过在 IronWebScraper 中重写 Parse 方法来处理博客内的不同类型页面。这种方法允许您将页面分类为不同部分,如评论和科学,并对每一个应用特定的解析逻辑。 是否可以将抓取的博客数据以结构化格式保存? 是的,使用 IronWebScraper,您可以将抓取得到的博客数据保存为 JSONL 这样结构化的格式。这种格式有助于以行对行 JSON 格式存储每个数据,以便于后续管理和处理。 如何为我的网页抓取器设置工作目录? 在 IronWebScraper 中,您可以通过配置抓取器来指定输出和缓存文件的存储位置,从而设置工作目录。这有助于高效组织抓取的数据。 网页抓取中的常见故障排除场景有哪些? 网页抓取中的常见故障排除场景包括处理网站结构变化、管理速率限制和应对反抓取措施。使用 IronWebScraper,您可以实现错误处理和日志记录来诊断和解决这些问题。 在哪里可以找到更多有关使用 IronWebScraper 的资源? 您可以在 Iron Software 网站上的网页抓取教程部分找到关于使用 IronWebScraper 的资源和教程,其中提供了详尽的指南和示例。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 准备开始了吗? Nuget 下载 125,527 | Version: 2025.11 刚刚发布 免费 NuGet 下载 总下载量:125,527 查看许可证