ماژول goquery به شما امکان می دهد با استفاده از یک نحو آشنا که از CSS به عاریت گرفته شده است، محتوا را از یک وب سایت انتخاب و استخراج کنید.
اسکرپینگ وب که به عنوان استخراج داده های وب نیز شناخته می شود، روشی خودکار برای استخراج داده یا محتوا از صفحات وب است.
اسکراپرهای وب استخراج داده ها را بدون دخالت انسان به صورت خودکار انجام می دهند. یک اسکراپر با ارسال درخواست های HTTP به یک صفحه وب دسترسی پیدا می کند، درست مانند مرورگر وب. با این حال، به جای نمایش HTML که واکشی می کند، آن را مطابق دستورالعمل شما پردازش می کند و نتیجه را ذخیره می کند.
اسکراپرهای وب برای واکشی داده ها از وب سایت هایی که API ارائه نمی دهند مفید هستند. آنها در زمینه هایی مانند علم داده، امنیت سایبری، فرانت اند و توسعه باطن محبوب هستند.
Web Scraping in Go
در Go، بسته های خراش وب مختلفی وجود دارد. محبوبترینها عبارتند از goquery، Colly و ChromeDP.
ChromeDP یک بسته درایور وب شبیه سلنیوم است. این پروتکل ابزارهای توسعهدهنده کروم را در Go بدون وابستگی پشتیبانی میکند.
Colly یک کتابخانه مخصوص خراش وب است که با استفاده از goquery ساخته شده است. اما goquery گزینه سریع تری برای خراش دادن وب سایت ها در Go است.
گوکوری چیست؟
کتابخانه CSS، jQuery، به الهام بخشیدن به goquery کمک کرد. این یک کتابخانه Go مبتنی بر بسته net/html است که توکنایزر و تجزیه کننده سازگار با HTML5 را پیاده سازی می کند. همچنین از بسته Cascadia استفاده می کند که انتخابگرهای CSS را برای استفاده با تجزیه کننده ارائه شده توسط net/html پیاده سازی می کند.
نصب goquery
برای نصب goquery دستور زیر را در ترمینال خود اجرا کنید. اگر با خطا مواجه شدید، نسخه Go خود را به روز کنید.
go get github.com/PuerkitoBio/goquery
فرآیند خراش دادن وب
می توانید فرآیند کلی خراش دادن را به سه کار کوچکتر تقسیم کنید:
- ایجاد درخواست های HTTP
- استفاده از انتخابگرها و مکان یاب ها برای دریافت داده های مورد نیاز.
- ذخیره داده ها در پایگاه داده یا ساختارهای داده برای پردازش بیشتر.
ایجاد درخواست HTTP در Go
می توانید درخواست های HTTP را با استفاده از بسته net/http که کتابخانه استاندارد Go شامل آن است ارسال کنید.
package main
import "net/http"
import "log"
import "fmt"
func main() {
webUrl := "https://news.ycombinator.com/"
response, err:= http.Get(webUrl)
if err != nil {
log.Fatalln(err)
} else if response.StatusCode == 200 {
fmt.Println("We can scrape this")
} else {
log.Fatalln("Do not scrape this")
}
}
http.Get یک بدنه پاسخ و یک خطا برمی گرداند. answer.StatusCode کد وضعیت درخواست-پاسخ است.
در هنگام درخواست HTTP، اگر کد وضعیت پاسخ 200 باشد، می توانید وب سایت را خراش دهید.
دریافت داده های مورد نیاز با استفاده از goquery
دریافت HTML وب سایت
ابتدا، شما باید HTML ساده را از پاسخ (response.body) تجزیه کنید تا یک شیء سند کامل که نمایانگر صفحه وب است به دست آورید:
document, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
log.Fatalln(err)
}
اکنون می توانید از شی سند برای دسترسی به ساختار و محتوای صفحه وب استفاده کنید.
انتخاب عناصر مورد نیاز از HTML
برای بررسی ساختار داده هایی که باید استخراج کنید، باید صفحه وب را بررسی کنید. این به شما کمک می کند تا یک انتخابگر برای دسترسی به آن بسازید.
با استفاده از انتخابگرها و مکان یاب ها، می توانید HTML مورد نیاز خود را با استفاده از متد Find شی سند استخراج کنید.
متد Find یک انتخابگر CSS را می گیرد تا عنصری را که حاوی داده های مورد نیاز شما است پیدا کند:
document.Find("tr.athing")
کد بالا فقط اولین عنصر HTML منطبق با انتخابگر را برمی گرداند، یا اگر اصلاً مطابقت نداشت، یک لیست خالی را برمی گرداند.
انتخاب چندین عنصر از HTML
بیشتر اوقات، شما می خواهید تمام عناصر HTML را که با انتخابگر شما مطابقت دارند واکشی کنید.
شما می توانید تمام عناصر منطبق در HTML را با استفاده از روش Every از مقداری که Find() برمی گرداند، انتخاب کنید. هر متد تابعی با دو پارامتر دارد: یک شاخص و یک انتخابگر از نوع *goquery.Selection.
document.Find("tr.athing").Each(func(index int, selector *goquery.Selection) {
/* Process selector here */
})
در بدنه تابع، می توانید داده های خاصی را که می خواهید از HTML انتخاب کنید. در این مورد، به پیوندها و عناوین هر پستی که صفحه لیست می کند نیاز دارید. از متد Find پارامتر انتخابگر برای محدود کردن مجموعه عناصر و استخراج متن یا مقادیر ویژگی استفاده کنید.
document.Find("tr.athing").Each(func(index int, selector *goquery.Selection) {
title := selector.Find("td.title").Text()
link, found := selector.Find("a.titlelink").Attr("href")
})
کد بالا متد Text نتیجه را از selector فراخوانی می کند.Find برای استخراج محتویات یک سلول جدول. انتخاب ویژگیها (مانند URLهای پیوند و تصویر) مستلزم استفاده از روش Attr است. این متد همچنین مقداری را برمی گرداند که نشان می دهد آیا اصلاً این ویژگی وجود دارد یا خیر.
این فرآیند برای انتخاب هر عنصر و ویژگی از یک صفحه وب یکسان است.
متد Find بسیار قدرتمند است و به طیف وسیعی از عملیات برای انتخاب و مکان یابی عناصر HTML اجازه می دهد. می توانید این موارد را در مستندات goquery بررسی کنید.
ذخیره داده های خراشیده شده
صفت پیوند و عنوان رشته هایی هستند که می توانید به متغیرها اختصاص دهید. در سناریوهای واقعی، شما در یک پایگاه داده یا یک ساختار داده برای دستکاری ذخیره خواهید کرد. اغلب، یک ساختار سفارشی ساده کافی است.
یک ساختار با عنوان و پیوند فیلدها و یک تکه از ساختارها برای نگه داشتن نوع ساختار ایجاد کنید.
type Information struct {
link string
title string
}
info := make([]Information, 0)
هنگامی که ساختار و برش را ایجاد کردید، در بدنه تابع متد سند، برش را در تابعی که به متد Find ارسال میکنید پر کنید. از نوع ساختار برای نمونه سازی ساختارهای داده جدید، که هر یک شامل یک نتیجه است، استفاده کنید.
info = append(info, Information{
title: title,
link: link,
})
این نوع اطلاعات (ساختار) را به اطلاعات (برش) اضافه می کند که از آن می توانید داده ها را به دلخواه دستکاری کنید.
چاپ برش نشان می دهد که شما با موفقیت وب سایت را خراش داده و برش را پر کرده اید.
fmt.Println(info)
منطقی است که داده های خراشیده شده را در یک کش محلی ذخیره کنید تا بیش از حد نیاز به سرور صفحه وب ضربه نزنید. این نه تنها ترافیک را کاهش می دهد، بلکه سرعت برنامه شما را افزایش می دهد زیرا بازیابی داده های محلی سریعتر از درخواست و حذف وب سایت ها است.
بسته های پایگاه داده زیادی در Go وجود دارد که می توانید از آنها برای ذخیره داده ها استفاده کنید. بسته پایگاه داده/sql از پایگاه داده های SQL پشتیبانی می کند. همچنین کلاینت های پایگاه داده NoSQL مانند درایور MongoDB Go و پایگاه های داده بدون سرور مانند FaunaDB با استفاده از درایور FaunaDB وجود دارد.
جوهر Web Scraping در Go
اگر میخواهید دادهها را از یک وبسایت پاک کنید، goquery یک مکان عالی برای شروع است. اما این یک بسته قدرتمند است که می تواند بیشتر از خراش دادن وب انجام دهد. شما می توانید در مورد عملکردهای آن در اسناد رسمی پروژه اطلاعات بیشتری کسب کنید.
خراش دادن وب یک مهارت مهم در زمینه های مختلف فناوری است و در بسیاری از پروژه های شما مفید خواهد بود.