การขูดเว็บโดยใช้ C#

Web Scraping เป็นเทคนิคที่ใช้ในการดึงข้อมูลจากเว็บไซต์ ช่วยให้กระบวนการดึงข้อมูลจากเว็บไซต์และไฟล์ HTML เป็นไปโดยอัตโนมัติ ในฐานะนักพัฒนา C# เราสามารถตรวจสอบ จับภาพ และแยกข้อมูล เช่น รูปภาพ วิดีโอ เสียง ฯลฯ จากหน้าเว็บได้อย่างง่ายดาย ในบทความนี้ เราจะได้เรียนรู้วิธีทำการขูดเว็บด้วยการแยกวิเคราะห์ HTML โดยใช้ C#

หัวข้อต่อไปนี้จะครอบคลุมในบทความนี้:

API การขูดเว็บ C#

สำหรับการคัดลอกเว็บจากไฟล์ HTML หรือ URL เราจะใช้ Aspose.HTML for .NET API เป็น API การประมวลผล HTML ขั้นสูงที่ช่วยให้สามารถสร้าง แก้ไข ดึงข้อมูล แปลง และเรนเดอร์เอกสาร HTML โดยไม่ต้องใช้ซอฟต์แวร์ภายนอก โปรด ดาวน์โหลด DLL ของ API หรือติดตั้งโดยใช้ NuGet

PM> Install-Package Aspose.Html

อ่านและแยก HTML โดยใช้ C#

เราสามารถอ่านและแยก HTML จากเอกสาร HTML ใด ๆ ได้โดยทำตามขั้นตอนด้านล่าง:

  1. โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
  2. แสดง HTML ภายในของไฟล์ไปยังคอนโซล

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการอ่านและแยกเนื้อหา HTML โดยใช้ C#

// ตัวอย่างโค้ดนี้สาธิตวิธีการแสดงเนื้อหาของเอกสาร HTML
// โหลดเอกสาร HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");

// แสดง HTML ภายในของเอกสาร
Console.WriteLine(document.Body.InnerHTML);
อ่านและแยก HTML โดยใช้ C#

อ่านและแยก HTML โดยใช้ C#

ในทำนองเดียวกัน เราสามารถอ่านและแยก HTML จากเว็บไซต์ที่ใช้งานจริงได้ดังที่แสดงด้านล่าง:

// ตัวอย่างโค้ดนี้สาธิตวิธีการแสดงเนื้อหาจาก URL ของเว็บไซต์ที่ใช้งานจริง
// เริ่มต้น Url
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// โหลดไฟล์ HTML โดยใช้อินสแตนซ์ Url
HTMLDocument document = new HTMLDocument(url);

// แสดง HTML ภายในของไฟล์ไปยังคอนโซล
Console.WriteLine(document.Body.InnerHTML);

ตรวจสอบองค์ประกอบเอกสารโดยใช้ C#

เราสามารถตรวจสอบเอกสารและองค์ประกอบต่างๆ ได้โดยทำตามขั้นตอนด้านล่าง:

  1. โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
  2. รับองค์ประกอบ HTML ของเอกสาร
  3. รับองค์ประกอบแรก/สุดท้ายขององค์ประกอบ HTML
  4. แสดงรายละเอียดองค์ประกอบเช่น TagName, TextContent

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการตรวจสอบองค์ประกอบเอกสารโดยใช้ C#

// ตัวอย่างโค้ดนี้สาธิตวิธีการตรวจสอบองค์ประกอบ HTML
// โหลดเอกสารจากไฟล์
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// รับองค์ประกอบ html ของเอกสาร
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// รับองค์ประกอบสุดท้ายขององค์ประกอบ html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// รับองค์ประกอบแรกขององค์ประกอบร่างกาย
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

ค้นหาองค์ประกอบเฉพาะโดยใช้ตัวกรองใน C#

เราสามารถใช้ตัวกรองแบบกำหนดเองเพื่อค้นหาองค์ประกอบเฉพาะ เช่น รับรูปภาพทั้งหมด ลิงก์ ฯลฯ เพื่อจุดประสงค์นี้ API จึงจัดเตรียมอินเทอร์เฟซ TreeWalker ช่วยให้สามารถนำทางแผนผังเอกสารหรือแผนผังย่อยโดยใช้มุมมองของเอกสารที่กำหนดโดยแฟล็กและตัวกรอง whatToShow (ถ้ามี) เราสามารถค้นหาองค์ประกอบเฉพาะโดยใช้ตัวกรองโดยทำตามขั้นตอนด้านล่าง:

  1. กำหนดตัวกรองโดยใช้คลาส NodeFilter และแทนที่เมธอด AcceptNode()
  2. โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
  3. เรียกเมธอด CreateTreeWalker() ใช้โหนดรูท สิ่งที่จะแสดง และ NodeFilter เป็นอาร์กิวเมนต์

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีค้นหาองค์ประกอบเฉพาะโดยใช้ C#

// ตัวอย่างโค้ดนี้สาธิตวิธีการสืบค้นข้อมูลโดยใช้ตัวกรอง
// โหลดเอกสาร HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// ในการเริ่มการนำทาง HTML เราจำเป็นต้องสร้างอินสแตนซ์ของ TreeWalker
// พารามิเตอร์ที่ระบุหมายความว่าเริ่มเดินจากรากของเอกสาร
// วนซ้ำโหนดทั้งหมดและใช้ตัวกรองแบบกำหนดเองของเรา
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // เนื่องจากเราใช้ตัวกรองของเราเอง โหนดปัจจุบันจะเป็นอินสแตนซ์ของ HTMLImageElement เสมอ
        // ดังนั้นเราจึงไม่จำเป็นต้องมีการตรวจสอบเพิ่มเติมที่นี่
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // เอาท์พุต: image1.png
        // เอาท์พุต: image2.png
    }
}
// ตัวอย่างโค้ดนี้สาธิตวิธีการกำหนดตัวกรองโหนด
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // ตัวกรองปัจจุบันจะข้ามองค์ประกอบทั้งหมด ยกเว้นองค์ประกอบ IMG
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

สืบค้นข้อมูลจาก HTML โดยใช้ C#

นอกจากนี้เรายังสามารถใช้ XPath Query เพื่อสืบค้นข้อมูลจากเอกสาร HTML โดยทำตามขั้นตอนที่ระบุด้านล่าง:

  1. โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
  2. เรียกใช้เมธอด Evaluate() ใช้สตริงนิพจน์ XPath เอกสาร และพิมพ์เป็นอาร์กิวเมนต์
  3. สุดท้าย วนซ้ำโหนดผลลัพธ์และแสดงข้อความ

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสืบค้นข้อมูลด้วยการสืบค้น XPath โดยใช้ C#

// ตัวอย่างโค้ดนี้สาธิตวิธีการสืบค้นข้อมูลโดยใช้แบบสอบถาม XPath
// เตรียมโค้ด HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// เริ่มต้นเอกสารตามรหัสที่เตรียมไว้
HTMLDocument document = new HTMLDocument(code, ".");

// ที่นี่เราประเมินนิพจน์ XPath ที่เราเลือกองค์ประกอบ SPAN ลูกทั้งหมด 
// จากองค์ประกอบที่แอตทริบิวต์ 'class' เท่ากับ 'happy':
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// วนซ้ำโหนดผลลัพธ์
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // เอาท์พุต: สวัสดี
    // เอาท์พุต: โลก!
}

แยกโดยใช้ตัวเลือก CSS ใน C#

เราสามารถแยกเนื้อหา HTML โดยใช้ตัวเลือก CSS ได้เช่นกัน เพื่อจุดประสงค์นี้ API จัดเตรียมเมธอด QuerySelectorAll() ที่ช่วยให้สามารถนำทางผ่านเอกสาร HTML และค้นหาองค์ประกอบที่จำเป็นได้ ใช้ตัวเลือกแบบสอบถามเป็นพารามิเตอร์และส่งกลับ NodeList ที่ตรงกันขององค์ประกอบทั้งหมด เราสามารถสอบถามโดยใช้ตัวเลือก CSS ได้โดยทำตามขั้นตอนด้านล่าง:

  1. โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
  2. เรียกใช้เมธอด QuerySelectorAll() ใช้ตัวเลือกแบบสอบถามเป็นอาร์กิวเมนต์
  3. สุดท้าย วนซ้ำรายการองค์ประกอบที่เป็นผลลัพธ์

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแยกเนื้อหา HTML โดยใช้ตัวเลือก CSS ใน C#

// เริ่มต้นเอกสารตามรหัสที่เตรียมไว้
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// ที่นี่เราสร้างตัวเลือก CSS ที่แยกองค์ประกอบ div ทั้งหมด
var elements = document.QuerySelectorAll("div");

// วนซ้ำรายการองค์ประกอบผลลัพธ์
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

รับใบอนุญาตฟรี

โปรดลองใช้ API โดยไม่มีข้อจำกัดในการประเมินโดยขอ ใบอนุญาตชั่วคราวฟรี

บทสรุป

ในบทความนี้ เราได้เรียนรู้วิธี:

  • อ่านและแยกเนื้อหาของเอกสาร HTML โดยใช้ C#;
  • ตรวจสอบองค์ประกอบเอกสารและค้นหาองค์ประกอบเฉพาะจาก HTML
  • ข้อมูลเฉพาะการสืบค้นและดึงข้อมูลโดยใช้ตัวเลือก CSS

นอกจากนี้ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Aspose.HTML for .NET API ได้โดยใช้ เอกสารประกอบ ในกรณีที่มีความคลุมเครือ โปรดติดต่อเราที่ ฟอรั่ม

ดูสิ่งนี้ด้วย