تحليل HTML في Go (Golang): المكتبات وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحليل HTML في Go (Golang): الأدوات والأمثلة العملية



Go (Golang) هي لغة مترجمة، ذات كتابة ثابتة، تم تطويرها في Google. بفضل الأداء العالي، والدعم المدمج للتوازي، والمكتبة القياسية الغنية، أصبحت Go واحدة من أفضل اللغات لاستخراج بيانات الويب وتحليل HTML. في هذه المقالة، سنستعرض المكتبات الرئيسية للعمل مع مستندات HTML في Go، ونقدم أمثلة كود، ونقارن إمكانياتها.



لماذا تحليل HTML في Go؟

تحليل HTML ضروري لاستخراج البيانات من صفحات الويب: الأخبار، الأسعار، معلومات الاتصال، نتائج البحث. Go مناسبة تمامًا لهذه المهمة بفضل:

  • سرعة التنفيذ العالية (يتم ترجمتها إلى كود آلة)
  • سهولة العمل مع الشبكة (الحزمة المدمجة net/http)
  • بساطة تحليل شجرة DOM من خلال المكتبات المتخصصة
  • دعم ممتاز لتعدد الخيوط (الغوروتينات والقنوات)


المكتبات الرئيسية لتحليل HTML في Go



1. net/html — المكتبة القياسية

golang.org/x/net/html هي محلل ومجزئ HTML منخفض المستوى من المكتبة القياسية لـ Go. توفر تحكمًا كاملاً في عملية التحليل، ولكنها تتطلب كتابة كود أكثر.

مثال: استخراج جميع الروابط (<a href>) من مستند HTML.

package main

import ( "fmt" "golang.org/x/net/html" "net/http" "log")

func main() { resp, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close()

doc, err := html.Parse(resp.Body) if err != nil { log.Fatal(err) }

var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, attr := range n.Attr { if attr.Key == "href" { fmt.Println(attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc)}

الإيجابيات: لا يتطلب تثبيت حزم خارجية، تحكم كامل. السلبيات: الكثير من الكود النمطي، غير مناسب للمحددات المعقدة.



2. goquery — بناء جملة شبيه بـ jQuery

github.com/PuerkitoBio/goquery هي المكتبة الأكثر شيوعًا لتحليل HTML في Go. توفر واجهة برمجة تطبيقات مشابهة لـ jQuery: Find()، Each()، Attr()، Text().

مثال: تحليل عناوين الأخبار من موقع.

package main

import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")

func main() { resp, err := http.Get("https://habr.com/ru/news/") if err != nil { log.Fatal(err) } defer resp.Body.Close()

doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }

doc.Find("h2.tm-article-snippet__title").Each(func(i int, s *goquery.Selection) { title := s.Find("a").Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s الرابط: %s", i+1, title, link) })}

الإيجابيات: بناء جملة بسيط، دعم محددات CSS، وثائق غنية. السلبيات: غير مناسب للمستندات الكبيرة جدًا (يحمّل كل شيء في الذاكرة).



3. colly — إطار عمل لاستخراج بيانات الويب

github.com/gocolly/colly هو إطار عمل قوي لجمع البيانات. يتضمن تحليل HTML (بناءً على goquery)، وإدارة قائمة انتظار الطلبات، ومعالجة cookies، وحدود السرعة، وغير ذلك الكثير.

مثال: جمع جميع الروابط من الصفحة الأولى لموقع مع تأخير بين الطلبات.

package main

import ( "fmt" "github.com/gocolly/colly/v2")

func main() { c := colly.NewC

توصيات