تحليل 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