Web парсінг в Golang: Повна інструкція 2023

Web парсінг в Golang: Повна інструкція 2023

25 січня 2023 · 13 хв. читання https://www.zenrows.com/blog/web-scraping-golang#prerequisites


Веб парсінг в Golang є популярним підходом для автоматичного отримання даних з Інтернету. Виконайте цей покроковий посібник, щоб навчитися легко збирати дані в Go та познайомитися з популярними бібліотеками Colly та chromedp.

Давайте розпочнемо!

Передумови

Налаштуйте середовище

Ось передумови, які ви маєте виконати для цього підручника:

  • без прапорця

    Go 1.19+: Підійде будь-яка версія Go, яка перевищує або дорівнює 1.19. Тут ви побачите версію 1.19 у дії, оскільки вона є останньою на момент написання.

  • без прапорця

    IDE для Go: Visual Studio Code з Go extension є рекомендованим.

Перш ніж продовжити роботу з цим посібником із копіювання веб-сторінок, переконайтеся, що у вас встановлено необхідні інструменти. Перейдіть за наведеними вище посиланнями, щоб завантажити, інсталювати та налаштувати необхідні інструменти за допомогою майстрів встановлення.

Налаштуйте проект Go

Після встановлення Go настав час ініціалізувати ваш проект web парсера Golang.

Створіть папку web-scraper-go і перейдить до неї за допомогою команд у терміналі:

mkdir web-scraper-go
cd web-scraper-go

Потім запустіть наведену нижче команду:

go mod init web-scraper


Команда init ініціалізує модуль Go web-scraper у папці проекту web-scraper-go.

Каталог web-scraper-go тепер міститиме файл go.mod, який виглядає наступним чином:


module web-scraper-go
go 1.19

Зауважте, що останній рядок змінюється залежно від вашої мовної версії.

Тепер ви готові налаштувати свій сценарій Go для збирання web сторінок. Створіть файл scraper.go та ініціалізуйте його, як показано нижче:

package main

import (
"fmt"
)

func main() {
// scraping logic...

fmt.Println("Hello, World!")
}

Перший рядок містить назву глобального пакета. Далі виконується імпорт, а потім функція main(). Це являє собою точку входу будь-якої програми Go та міститиме логіку веб-збирання Golang.

Запустіть сценарій, щоб переконатися, що все працює належним чином:

go run scraper.go

У ході нормального виконання сценарія, термінал повинен надрукувати наступне:

Hello, World!

Тепер, коли ви налаштували базовий проект Go, давайте глибше заглибимося в те, як створити збір даних за допомогою Golang.

Як парсити веб-сайт з Go

Щоб дізнатися, як сканувати web сайт за допомогою Go, використовуйте ScrapeMe як цільовий веб-сайт.

Як ви бачите вище, це магазин Pokémon. Наша місія полягатиме в тому, щоб отримати з нього всі дані про продукт.

Крок 1: Початок роботи з Colly

Colly — це бібліотека з відкритим вихідним кодом, яка забезпечує простий інтерфейс на основі зворотних викликів для написання парсера, сканера або павука. Вона постачається з розширеним API парсера Go, який дозволяє завантажувати HTML-сторінку, автоматично аналізувати її вміст, вибирати HTML-елементи з DOM і отримувати з них дані.

Встановіть Colly та його залежності:

go get github.com/gocolly/colly

Ця команда створить файл go.sum у корені вашого проекту та оновить файл go.mod з усіма необхідними залежностями відповідно.

Дочекайтеся завершення процесу встановлення. Потім імпортуйте Colly у свій файл scraper.go, як показано нижче:

package main

import (
"fmt"

// importing Colly
"github.com/gocolly/colly"
)

func main() {
// scraping logic...

fmt.Println("Hello, World!")
}

Перш ніж розпочинати роботу з цією бібліотекою, вам потрібно зрозуміти кілька ключових понять.

По-перше, головною сутністю Colly є Collector. Collector дозволяє виконувати HTTP-запити. Крім того, це надає вам доступ до зворотних викликів web парсінга, які пропонує інтерфейс Colly.

Ініціалізуйте Colly Collector за допомогою функції NewCollector:

c := colly.NewCollector()

Використовуйте Colly, щоб відвідати веб-сторінку за допомогою Visit():

c.Visit("https://en.wikipedia.org/wiki/Main_Page")

Приєднайте різні типи функцій зворотного виклику до Collector, як показано нижче:

c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting: ", r.URL)
})

c.OnError(func(_ *colly.Response, err error) {
log.Println("Something went wrong: ", err)
})

c.OnResponse(func(r *colly.Response) {
fmt.Println("Page visited: ", r.Request.URL)
})

c.OnHTML("a", func(e *colly.HTMLElement) {
// printing all URLs associated with the a links in the page
fmt.Println("%v", e.Attr("href"))
})

c.OnScraped(func(r *colly.Response) {
fmt.Println(r.Request.URL, " scraped!")
})

Ці функції виконуються в такому порядку:

  • OnRequest(): Викликається перед виконанням HTTP-запиту за допомогою Visit().

  • OnError(): Викликається, якщо сталася помилка під час запиту HTTP.

  • OnResponse(): Викликається після отримання відповіді від сервера.

  • OnHTML(): Викликається відразу після OnResponse(), якщо отриманий вміст є HTML.

  • OnScraped(): Викликається після всіх виконань зворотного виклику OnHTML().

Кожна з цих функцій приймає зворотний виклик як параметр. Спеціальний зворотний виклик виконується, коли виникає подія, пов’язана з функцією Colly. Таким чином, ці п’ять функцій Colly допоможуть вам створити ваш збірник даних Golang.

Крок 2. Відвідайте сторінку Target HTML

Виконайте запит HTTP GET, щоб завантажити цільову HTML-сторінку в Colly за допомогою:

// downloading the target HTML page
c.Visit("https://scrapeme.live/shop/")

Функція Visit() запускає життєвий цикл Colly, запускаючи подію onRequest. Далі будуть інші події.

Крок 3. Знайдіть цікаві елементи HTML

У цьому підручнику Go зі збирання даних йдеться про отримання всіх даних про продукт, тому давайте візьмемо елементи продукту HTML. Клацніть правою кнопкою миші елемент продукту на сторінці, а потім виберіть опцію «Inspect», щоб отримати доступ до розділу DevTools:

Зверніть увагу, що HTML-елемент target li має клас .product і зберігає:

  • Елемент із URL-адресою продукту.

  • Елемент img із зображенням продукту.

  • Елемент h2 із назвою продукту.

  • Елемент .price із ціною продукту.

Виберіть усі елементи продукту li.product HTML на сторінці за допомогою Colly:

c.OnHTML("li.product", func(e *colly.HTMLElement) {
// ...
})

Функцію OnHTML() можна пов’язати з селектором CSS і функцією зворотного виклику. Colly виконає зворотний виклик, коли знайде елементи HTML, що відповідають селектором. Зверніть увагу, що параметр e функції зворотного виклику представляє один HTMLElement li.product.

Давайте тепер подивимося, як отримати дані з елемента HTML за допомогою функцій, наданих Colly.

Крок 4: Вилучіть дані продукту з вибраних елементів HTML

Перш ніж розпочати, вам потрібна структура даних, у якій зберігатимуться зібрані дані. Визначте структуру PokemonProduct таким чином:

// defining a data structure to store the scraped data
type PokemonProduct struct {
url, image, name, price string
}

Якщо ви не знайомі з цим, Go Struct — це набір введених полів, які можна використовувати для збору даних.

Потім ініціалізуйте slice PokemonProduct, який міститиме зібрані дані:

// initializing the slice of structs that will contain the scraped data
var pokemonProducts []PokemonProduct

У Go зрізи забезпечують ефективний спосіб роботи з послідовностями введених даних. Ви можете думати про них як про списки.

Тепер реалізуйте логіку скрапінгу:

// iterating over the list of HTML product elements
c.OnHTML("li.product", func(e *colly.HTMLElement) {
// initializing a new PokemonProduct instance
pokemonProduct := PokemonProduct{}

// scraping the data of interest
pokemonProduct.url = e.ChildAttr("a", "href")
pokemonProduct.image = e.ChildAttr("img", "src")
pokemonProduct.name = e.ChildText("h2")
pokemonProduct.price = e.ChildText(".price")

// adding the product instance with scraped data to the list of products
pokemonProducts = append(pokemonProducts, pokemonProduct)
})


Інтерфейс HTMLElement надає методи ChildAttr() і ChildText(). Вони дозволяють витягувати текст значення атрибута з дочірнього елемента, визначеного селектором CSS відповідно. За допомогою двох простих функцій ви реалізували всю логіку вилучення даних.

Нарешті, ви можете додати новий елемент до фрагмента зібраних елементів за допомогою append(). Дізнайтеся більше про те, як append() працює в Go.

Фантастично! Ви щойно навчилися очищати веб-сторінку в Go за допомогою Colly.

Export the retrieved data to CSV as a next step.

Крок 5. Перетворіть зібрані дані у CSV

Експортувати зібрані дані у файл CSV у Go за такою логікою:

// opening the CSV file
file, err := os.Create("products.csv")
if err != nil {
log.Fatalln("Failed to create output CSV file", err)
}
defer file.Close()

// initializing a file writer
writer := csv.NewWriter(file)

// defining the CSV headers
headers := []string{
"url",
"image",
"name",
"price",
}
// writing the column headers
writer.Write(headers)

// adding each Pokemon product to the CSV output file
for _, pokemonProduct := range pokemonProducts {
// converting a PokemonProduct to an array of strings
record := []string{
pokemonProduct.url,
pokemonProduct.image,
pokemonProduct.name,
pokemonProduct.price,
}

// writing a new CSV record
writer.Write(record)
}
defer writer.Flush()

Цей фрагмент створює файл products.csv і ініціалізує його стовпцями заголовків. Потім він виконує ітерацію по фрагменту зібраних PokemonProducts, перетворює кожен із них на новий запис CSV і додає його до файлу CSV.

Щоб цей фрагмент працював, переконайтеся, що у вас є такі імпорти:

import (
"encoding/csv"
"log"
"os"
// ...
)


Отже, ось так зараз виглядає остаточний код програми прарсінгу:

package main

import (
"encoding/csv"
"github.com/gocolly/colly"
"log"
"os"
)

// initializing a data structure to keep the scraped data
type PokemonProduct struct {
url, image, name, price string
}

func main() {
// initializing the slice of structs to store the data to scrape
var pokemonProducts []PokemonProduct

// creating a new Colly instance
c := colly.NewCollector()

// visiting the target page
c.Visit("https://scrapeme.live/shop/")

// scraping logic
c.OnHTML("li.product", func(e *colly.HTMLElement) {
pokemonProduct := PokemonProduct{}

pokemonProduct.url = e.ChildAttr("a", "href")
pokemonProduct.image = e.ChildAttr("img", "src")
pokemonProduct.name = e.ChildText("h2")
pokemonProduct.price = e.ChildText(".price")

pokemonProducts = append(pokemonProducts, pokemonProduct)
})

// opening the CSV file
file, err := os.Create("products.csv")
if err != nil {
log.Fatalln("Failed to create output CSV file", err)
}
defer file.Close()

// initializing a file writer
writer := csv.NewWriter(file)

// writing the CSV headers
headers := []string{
"url",
"image",
"name",
"price",
}
writer.Write(headers)

// writing each Pokemon product as a CSV row
for _, pokemonProduct := range pokemonProducts {
// converting a PokemonProduct to an array of strings
record := []string{
pokemonProduct.url,
pokemonProduct.image,
pokemonProduct.name,
pokemonProduct.price,
}

// adding a CSV record to the output file
writer.Write(record)
}
defer writer.Flush()
}

Запустіть ваш код Go за допомогою:

go run scraper.go

Потім ви знайдете файл products.csv у кореневому каталозі вашого проекту. Відкрийте його, і він повинен містити це:

Це воно!

Передові методи веб-збирання за допомогою Golang

Тепер, коли ви знаєте основи web парсінгу за допомогою Go, настав час заглибитися в більш просунуті підходи.

Web Crawling with Go

Зверніть увагу, що список продуктів Pokémon, які потрібно отримати, розбитий на сторінки. У результаті цільовий веб-сайт складається з багатьох веб-сторінок. Якщо ви хочете отримати всі дані про продукт, вам потрібно відвідати весь веб-сайт.

Щоб сканувати веб-сторінку в Go та сканувати весь веб-сайт, вам спочатку знадобляться всі посилання на сторінки. Отже, клацніть правою кнопкою миші на будь-якому елементі HTML з номером сторінки та виберіть опцію «Inspect».

Ваш браузер надасть доступ до розділу DevTools нижче з виділеним вибраним елементом HTML:

Якщо ви подивитесь на всі HTML-елементи розбиття на сторінки, то побачите, що всі вони ідентифіковані селектором CSS .page-numbers. Використовуйте цю інформацію, щоб застосувати сканування в Go, як показано нижче:

// initializing the list of pages to scrape with an empty slice
var pagesToScrape []string

// the first pagination URL to scrape
pageToScrape := "https://scrapeme.live/shop/page/1/"

// initializing the list of pages discovered with a pageToScrape
pagesDiscovered := []string{ pageToScrape }

// current iteration
i := 1
// max pages to scrape
limit := 5

// initializing a Colly instance
c := colly.NewCollector()

// iterating over the list of pagination links to implement the crawling logic
c.OnHTML("a.page-numbers", func(e *colly.HTMLElement) {
// discovering a new page
newPaginationLink := e.Attr("href")

// if the page discovered is new
if !contains(pagesToScrape, newPaginationLink) {
// if the page discovered should be scraped
if !contains(pagesDiscovered, newPaginationLink) {
pagesToScrape = append(pagesToScrape, newPaginationLink)
}
pagesDiscovered = append(pagesDiscovered, newPaginationLink)
}
})

c.OnHTML("li.product", func(e *colly.HTMLElement) {
// scraping logic...
})

c.OnScraped(func(response *colly.Response) {
// until there is still a page to scrape
if len(pagesToScrape) != 0 && i < limit {
// getting the current page to scrape and removing it from the list
pageToScrape = pagesToScrape[0]
pagesToScrape = pagesToScrape[1:]

// incrementing the iteration counter
i++

// visiting a new page
c.Visit(pageToScrape)
}
})

// visiting the first page
c.Visit(pageToScrape)

// convert the data to CSV...

Оскільки ви, можливо, захочете програмно зупинити роботу зберігача даних Go, вам знадобиться обмежувальна змінна. Це максимальна кількість сторінок, які може відвідати веб-павук Golang.

В останньому рядку фрагмент сканує першу сторінку розбивки. Потім запускається подія onHTML. У зворотному виклику onHTML() веб-сканер Go шукає нові посилання на сторінки. Якщо він знаходить нове посилання, він додає його до черги сканування. Потім він повторює цю логіку з новим посиланням. Зрештою, він зупиняється, коли досягається ліміт або немає нових сторінок для сканування.

Наведена вище логіка сканування була б неможливою без змінних фрагментів pagesDiscovered і pagesToScrape. Вони допомагають відстежувати, які сторінки сканер Go зібрав і незабаром відвідає.

Зауважте, що функція contains() є спеціальною функцією утиліти Go, визначеною нижче:

func contains(s []string, str string) bool {
for _, v := range s {
if v == str {
return true
}
}

return false
}

Його мета — просто перевірити, чи присутній рядок у фрагменті.

Молодець! Тепер ви можете сканувати веб-сайт із сторінками ScrapeMe за допомогою Golang!

Уникайте блокування

На багатьох веб-сайтах реалізовано анти-скрапінг-анти-бот-техніку. Найпростіший підхід передбачає заборону HTTP-запитів на основі їх заголовків. Зокрема, вони зазвичай блокують HTTP-запити, які надходять із недійсним заголовком User-Agent.

Установіть глобальний заголовок User-Agent для всіх запитів, які виконує Colly, за допомогою поля UserAgent Collect таким чином:

// setting a valid User-Agent header
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"

Не забувайте, що це лише одна з багатьох технік проти парсінгу, з якими вам, можливо, доведеться мати справу.

Використовуйте ZenRows, щоб легко подолати ці проблеми під час сканування веб-сторінок.

Паралельний Web парсінг в Golang

Парсінг даних у Go може зайняти багато часу. Причиною може бути повільне підключення до Інтернету, перевантажений веб-сервер або просто велика кількість сторінок, які потрібно отримати. Ось чому Colly підтримує паралельне сканування! Якщо ви не знаєте, що це означає, паралельне сканування веб-сторінок у Go включає вилучення даних із кількох сторінок одночасно.

Докладніше, це список усіх сторінок розбиття на сторінки, які має відвідати ваш сканер:

pagesToScrape := []string{
"https://scrapeme.live/shop/page/1/",
"https://scrapeme.live/shop/page/2/",
// ...
"https://scrapeme.live/shop/page/47/",
"https://scrapeme.live/shop/page/48/",
}

Завдяки паралельному скануванню ваш павук для збирання даних Go зможе відвідувати та отримувати дані з кількох веб-сторінок одночасно. Це значно пришвидшить процес вишкрібання!

Використовуйте Colly для реалізації паралельного веб-павука:

c := colly.NewCollector(
// turning on the asynchronous request mode in Colly
colly.Async(true),
)

c.Limit(&colly.LimitRule{
// limit the parallel requests to 4 request at a time
Parallelism: 4,
})

c.OnHTML("li.product", func(e *colly.HTMLElement) {
// scraping logic...
})

// registering all pages to scrape
for _, pageToScrape := range pagesToScrape {
c.Visit(pageToScrape)
}

// wait for tColly to visit all pages
c.Wait()

// export logic...

Colly поставляється з асинхронним режимом. Якщо ця можливість ввімкнена, це дозволяє Colly відвідувати кілька сторінок одночасно. Зокрема, Colly відвідає стільки сторінок одночасно, скільки значення параметра Parallelism.

Увімкнувши паралельний режим у вашому сценарії web парсінга Golang, ви досягнете кращої продуктивності. У той же час вам може знадобитися змінити частину логіки коду. Це тому, що більшість структур даних у Go не є потокобезпечними, тому ваш сценарій може зіткнутися з умовою змагання (race condition).

Чудово! Ви щойно навчилися основам паралельного сканування веб-сторінок!

Парсінг Web сайтів із динамічним вмістом за допомогою Headless браузера в Go

Веб-сайт зі статичним вмістом постачається з усім вмістом, попередньо завантаженим на HTML-сторінки, які повертає сервер. Це означає, що ви можете отримати дані з веб-сайту зі статичним вмістом, просто розібравши його вміст HTML.

З іншого боку, інші веб-сайти покладаються на JavaScript для візуалізації сторінок або використовують його для виконання викликів API та асинхронного отримання даних. Такі веб-сайти називаються веб-сайтами з динамічним вмістом, і для їх відтворення потрібен браузер.

Вам знадобиться інструмент, який може запускати JavaScript, наприклад безголовий браузер, бібліотека якого надає можливості браузера та дозволяє завантажувати веб-сторінку в спеціальному браузері без графічного інтерфейсу. Потім ви можете наказати безголовому браузеру імітувати взаємодію користувача.

The most popular headless browser library for Golang is chromedp. Install it with:

Найпопулярнішою бібліотекою безголового браузера для Golang є chromedp. Встановіть його за допомогою:

go get -u github.com/chromedp/chromedp

Потім скористайтеся chromedp, щоб отримати дані зі ScrapeMe у браузері, як описано нижче:

package main

import (
"context"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
)

type PokemonProduct struct {
url, image, name, price string
}

func main() {
var pokemonProducts []PokemonProduct

// initializing a chrome instance
ctx, cancel := chromedp.NewContext(
context.Background(),
chromedp.WithLogf(log.Printf),
)
defer cancel()

// navigate to the target web page and select the HTML elements of interest
var nodes []*cdp.Node
chromedp.Run(ctx,
chromedp.Navigate("https://scrapeme.live/shop"),
chromedp.Nodes(".product", &nodes, chromedp.ByQueryAll),
)

// scraping data from each node
var url, image, name, price string
for _, node := range nodes {
chromedp.Run(ctx,
chromedp.AttributeValue("a", "href", &url, nil, chromedp.ByQuery, chromedp.FromNode(node)),
chromedp.AttributeValue("img", "src", &image, nil, chromedp.ByQuery, chromedp.FromNode(node)),
chromedp.Text("h2", &name, chromedp.ByQuery, chromedp.FromNode(node)),
chromedp.Text(".price", &price, chromedp.ByQuery, chromedp.FromNode(node)),
)

pokemonProduct := PokemonProduct{}

pokemonProduct.url = url
pokemonProduct.image = image
pokemonProduct.name = name
pokemonProduct.price = price

pokemonProducts = append(pokemonProducts, pokemonProduct)
}

// export logic
}

Функція chromedp Nodes() дає змогу вказувати безголовому браузеру виконати запит. Таким чином ви можете вибрати елементи HTML продукту та зберегти їх у змінній nodes. Потім переберіть їх і застосуйте методи AttributeValue() і Text(), щоб отримати дані, які вас цікавлять.

Виконання веб-збирання в Go with Colly або chomedp нічим не відрізняється. Різниця між цими двома підходами полягає в тому, що chromedp виконує інструкції зі збирання в браузері.

With chromedp, you can crawl dynamic-content websites and interact with a web page in a browser as a real user would. This also means that your script is less likely to be detected as a bot, so chromedp makes it easy to scrape a web page without getting blocked.

За допомогою chromedp ви можете сканувати веб-сайти з динамічним вмістом і взаємодіяти з веб-сторінкою у браузері, як це робив би справжній користувач. Це також означає, що ваш сценарій з меншою ймовірністю буде виявлено як бот, тому chromedp дозволяє легко сканувати веб-сторінку без блокування.

Навпаки, Colly обмежений веб-сайтами зі статичним вмістом і не пропонує можливостей браузера.

Зібрати все разом: остаточний код

Ось так виглядає повний парсер Golang на основі Colly з скануванням і базовою логікою антиблокування:

package main

import (
"encoding/csv"
"github.com/gocolly/colly"
"log"
"os"
)

// defining a data structure to store the scraped data
type PokemonProduct struct {
url, image, name, price string
}

// it verifies if a string is present in a slice
func contains(s []string, str string) bool {
for _, v := range s {
if v == str {
return true
}
}

return false
}

func main() {
// initializing the slice of structs that will contain the scraped data
var pokemonProducts []PokemonProduct

// initializing the list of pages to scrape with an empty slice
var pagesToScrape []string

// the first pagination URL to scrape
pageToScrape := "https://scrapeme.live/shop/page/1/"

// initializing the list of pages discovered with a pageToScrape
pagesDiscovered := []string{ pageToScrape }

// current iteration
i := 1
// max pages to scrape
limit := 5

// initializing a Colly instance
c := colly.NewCollector()
// setting a valid User-Agent header
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"

// iterating over the list of pagination links to implement the crawling logic
c.OnHTML("a.page-numbers", func(e *colly.HTMLElement) {
// discovering a new page
newPaginationLink := e.Attr("href")

// if the page discovered is new
if !contains(pagesToScrape, newPaginationLink) {
// if the page discovered should be scraped
if !contains(pagesDiscovered, newPaginationLink) {
pagesToScrape = append(pagesToScrape, newPaginationLink)
}
pagesDiscovered = append(pagesDiscovered, newPaginationLink)
}
})

// scraping the product data
c.OnHTML("li.product", func(e *colly.HTMLElement) {
pokemonProduct := PokemonProduct{}

pokemonProduct.url = e.ChildAttr("a", "href")
pokemonProduct.image = e.ChildAttr("img", "src")
pokemonProduct.name = e.ChildText("h2")
pokemonProduct.price = e.ChildText(".price")

pokemonProducts = append(pokemonProducts, pokemonProduct)
})

c.OnScraped(func(response *colly.Response) {
// until there is still a page to scrape
if len(pagesToScrape) != 0 && i < limit {
// getting the current page to scrape and removing it from the list
pageToScrape = pagesToScrape[0]
pagesToScrape = pagesToScrape[1:]

// incrementing the iteration counter
i++

// visiting a new page
c.Visit(pageToScrape)
}
})

// visiting the first page
c.Visit(pageToScrape)

// opening the CSV file
file, err := os.Create("products.csv")
if err != nil {
log.Fatalln("Failed to create output CSV file", err)
}
defer file.Close()

// initializing a file writer
writer := csv.NewWriter(file)

// defining the CSV headers
headers := []string{
"url",
"image",
"name",
"price",
}
// writing the column headers
writer.Write(headers)

// adding each Pokemon product to the CSV output file
for _, pokemonProduct := range pokemonProducts {
// converting a PokemonProduct to an array of strings
record := []string{
pokemonProduct.url,
pokemonProduct.image,
pokemonProduct.name,
pokemonProduct.price,
}

// writing a new CSV record
writer.Write(record)
}
defer writer.Flush()
}

Фантастично! Приблизно за 100 рядків коду ви створили веб-скребок у Golang!

Інші Web бібліотеки копіювання для Go

Інші чудові бібліотеки для веб-збирання за допомогою Golang:

  • ZenRows: Повний API для сканування веб-сторінок, який протидіє всім анти-ботовим заходам. Він оснащений можливостями безголового браузера, обходом CAPTCHA, ротаційними проксі-серверами тощо.

  • GoQuery: Бібліотека Go, яка пропонує синтаксис і набір функцій, подібних до jQuery. Ви можете використовувати його для виконання веб парсінгу так само, як це робили зроблено у JQuery.

  • Ferret: Переносна, розширювана та швидка система сканування веб-сторінок, спрямована на спрощення вилучення даних з Інтернету. Ferret дозволяє користувачам зосередитися на даних і базується на унікальній декларативній мові.

  • Selenium: Ймовірно, найвідоміший безголовий браузер, ідеальний для сканування динамічного вмісту. Він не пропонує офіційної підтримки, але є порт для його використання в Go.

Висновок

У цьому покроковому підручнику Go ви побачили будівельні блоки, щоб розпочати роботу з веб парсінгу за допомогою Golang.

Як підсумок, ви дізналися:

  • Як виконувати базові дії, що збирають дані за допомогою Colly.

  • Як досягти логіки сканування, щоб відвідати весь веб-сайт.

  • Причина, чому вам може знадобитися безголовий браузер Go.

  • Як скопіювати веб-сайт із динамічним вмістом за допомогою chromedp.

Парсінг може стати складним завданням через заходи проти парсінга, які застосовуються на кількох веб-сайтах. Багато бібліотек намагаються подолати ці перешкоди. Щоб уникнути цих проблем, найкраще використовувати API для копіювання веб-сайтів, наприклад ZenRows. Це рішення дозволяє обійти всі системи захисту від ботів одним викликом API.


Часті запитання

Як ви парсите в Golang?

Ви можете виконувати веб парсінг у Golang так само, як і в будь-якій іншій мові програмування. По-перше, отримайте бібліотеку Go для веб парсінга. Потім застосуйте його, щоб відвідати цільовий веб-сайт, вибрати елементи HTML, які вас цікавлять, і отримати з них дані.

Який найкращий спосіб парсінга за допомогою Golang?

Існує кілька способів сканування веб-сторінок за допомогою мови програмування Go. Як правило, це передбачає використання популярних бібліотек Go для веб-збирання. Найкращий спосіб очищення веб-сторінок за допомогою Golang залежить від конкретних вимог вашого проекту. Кожна з бібліотек має свої сильні та слабкі сторони, тому виберіть ту, яка найкраще підходить для вашого випадку використання.