Как использовать Geziyor для веб-скрапинга

Как использовать Geziyor для веб-скрейпинга?

В этом руководстве я покажу, как настроить Geziyor, использовать его для сбора данных и даже экспортировать эти данные в CSV-файл. К концу вы будете готовы погрузиться в веб-скрапинг с Geziyor!

Что такое Geziyor?

Geziyor - это GolangФреймворк на Go, специально предназначенный для веб-скрапинга и краулинга. Он создан для разработчиков, которым нужно извлекать данные с сайтов без ручной обработки HTTP-запросов, парсинга HTML и проблем с конкурентностью. Geziyor использует горутины Go для обработки параллельных запросов, что позволяет эффективно собирать данные сразу с нескольких веб-страниц. Также он включает встроенные возможности для управления cookies, кэширования контента и экспорта данных в различные форматы.

Зачем использовать Geziyor?

Geziyor предлагает несколько преимуществ, которые делают его привлекательным выбором для веб-скрейпинга:

  1. Concurrent Scraping: Geziyor упрощает одновременный сбор данных с нескольких страниц с помощью горутин Go.
  2. Easy HTML Parsing: Geziyor использует встроенный HTML-парсер с поддержкой CSS-селекторов, что позволяет легко извлекать данные из HTML-элементов.
  3. Customizable: Вы можете адаптировать фреймворк под свои задачи, добавив пользовательскую логику для конкретных задач скрейпинга.
  4. Data Export: Geziyor поддерживает автоматический экспорт данных в разные форматы, включая CSV и JSON.
  5. Кэширование и управление сессиями: Geziyor предлагает кэширование контента и управление сессиями, что помогает эффективнее обрабатывать повторный сбор данных.

Теперь давайте разберемся, как использовать Geziyor для сбора данных с сайтов.

Настройка Geziyor для веб-скрейпинга

Прежде чем начать собирать данные с сайтов с помощью Geziyor, нужно настроить окружение. Geziyor требует Go 1.22 или новее, поэтому убедитесь, что у вас установлена последняя версия Go. Скачать ее можно с официального Веб-сайт на Go.

Шаг 1: Создайте Go-проект

Откройте терминал и создайте новый каталог для проекта по сбору данных. Перейдите в этот каталог и инициализируйте Go-проект.

mkdir my_scraper
cd my_scraper
go mod init scraper

Шаг 2: Установите Geziyor

Чтобы использовать Geziyor в своём проекте, нужно установить его с помощью команды `go get`:

go get -u github.com/geziyor/geziyor

Эта команда загрузит и установит фреймворк Geziyor в ваш проект.

Шаг 3: Создайте код скрапера

Once Geziyor is installed, create a new file called scraper.go in your project directory. This file will contain the code for scraping the target website.

Шаг 4: Сделайте первый запрос для получения HTML

To begin, let’s create a simple scraper that makes an HTTP request to a website and prints out the raw HTML content of the page. In your scraper.go file, add the following code:

package главная
импорт (
"fmt"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
)
func главная() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs: []string{"https://www.example.com"},
ParseFunc: scraper,
RobotsTxtDisabled: true,
}).Start()
}
func скребок(g *geziyor.Geziyor, r *client.Response) {
fmt.Println("Содержимое HTML:", r.HTMLDoc.Text())
}

В этом коде:

  • StartURLs указывает URL, с которого нужно собирать данные.
  • ParseFunc — это функция, которая обрабатывает HTML-контент, возвращённый запросом.
  • RobotsTxtDisabled: true tells Geziyor to ignore robots.txt files, which are often used to block web crawlers.

Запустите этот код, выполнив в терминале следующую команду:

go Запустите скрапер.go

Это загрузит HTML-контент страницы и выведет его в терминал.

Шаг 5: Извлечение конкретных данных из HTML

Теперь, когда вы знаете, как получить полный HTML-код, давайте извлечем со страницы конкретные данные. Предположим, что вы хотите извлечь названия товаров и цены с интернет-магазина.

Чтобы извлекать конкретные данные, используйте CSS-селекторы. Давайте доработаем функцию скрейпера, чтобы извлекать названия и цены товаров. Вот пример:

package главная
импорт (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
)
func главная() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs: []string{"https://www.example.com/products"},
ParseFunc: scraper,
RobotsTxtDisabled: true,
}).Start()
}
func скребок(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
fmt.Println("Товар:", name, "Цена:", price)
})
}

В этом коде:

  • Мы используем пакет goquery для разбора HTML.
  • Функция Find с CSS-селектором позволяет извлекать название и цену товара из каждой карточки товара на странице.

Шаг 6: Экспорт данных в CSV-файл

Geziyor также позволяет легко экспортировать собранные данные в CSV-файл. Давайте изменим скрейпер, чтобы сохранять извлеченные данные о товарах в CSV-файл.

Сначала импортируйте модуль geziyor/export, затем добавьте параметр Exporters в объект Geziyor:

package главная
импорт (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/geziyor/geziyor"
"github.com/geziyor/geziyor/client"
"github.com/geziyor/geziyor/export"
)
func главная() {
geziyor.NewGeziyor(&geziyor.Options{
StartURLs: []string{"https://www.example.com/products"},
ParseFunc: scraper,
RobotsTxtDisabled: true,
Exporters: []export.Exporter{
&export.CSV{FileName: "products.csv"},
},
}).Start()
}
func скребок(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
g.Exports <- map[string]interface{}{
"Name": name,
"Price": price,
}
})
}

Вот:

  • The CSV exporter writes the extracted product data to a file called products.csv in the root directory of your project.
  • В CSV-файл записываются название и цена каждого товара.

Шаг 7: Обработка пагинации и сбор данных с нескольких страниц

У многих сайтов контент размещён на нескольких страницах, и его нужно извлекать. Geziyor упрощает переход по ссылкам пагинации и сбор данных с нескольких страниц.

Let’s modify the scraper function to follow the “Next” button on the page, which usually links to the next set of products. Here’s how you can implement pagination:

func скребок(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product").Each(func(i int, s *goquery.Selection) {
name := s.Find("h2.product-name").Text()
price := s.Find("span.product-price").Text()
g.Exports <- map[string]interface{}{
"Name": name,
"Price": price,
}
})
// Follow the "Next" button link
если href, ok := r.HTMLDoc.Find("a.next").Attr("href"); ok {
g.Get(r.JoinURL(href), scraper)
}
}

In this code, after scraping the current page, Geziyor checks if there is a “Next” button (a.next). If the button exists, it follows the link to the next page and continues scraping.

Шаг 8: Обработка страниц, отрендеренных JavaScript

Некоторые сайты используют JavaScript для динамической загрузки контента. Geziyor не поддерживает рендеринг JavaScript из коробки, но вы можете использовать функцию GetRendered, чтобы дождаться, пока JavaScript загрузит контент.

Вот пример того, как извлекать данные со страницы, отрендеренной JavaScript:

func главная() {
geziyor.NewGeziyor(&geziyor.Options{
StartRequestsFunc: requestFunc,
ParseFunc: scraper,
RequestDelay: 10,
}).Start()
}
func requestFunc(g *geziyor.Geziyor) {
g.GetRendered("https://www.example.com/javascript-page", g.Opt.ParseFunc)
}
func скребок(g *geziyor.Geziyor, r *client.Response) {
r.HTMLDoc.Find("div.product-info").Each(func(i int, s *goquery.Selection) {
fmt.Println("Товар:", s.Find(".product-name").Text(), "Цена:", s.Find(".product-price").Text())
})
}

В этом коде:

GetRendered ждёт, пока JavaScript загрузит контент, прежде чем продолжить сбор данных.

Чтобы еще больше повысить надежность скрейпинга, рассмотрите возможность интеграции резидентные прокси Bright Data в рабочий процесс с Geziyor. Эти прокси помогут обойти антибот-защиту и обеспечить быстрое, бесперебойное извлечение данных даже с самых сложных сайтов. Интересуют другие провайдеры? Ознакомьтесь с моим списком Лучшие резидентные прокси.

Заключение

Geziyor — это мощный и простой в использовании фреймворк для веб-скрейпинга на Golang. Благодаря возможностям параллельного сбора данных, простому API и встроенной парсинг HTML, вы можете быстро настроить и начать собирать данные с сайтов. Вы также можете экспортировать данные в таких форматах, как CSV и JSON, и решать сложные задачи, такие как пагинации и рендеринг JavaScript. Если вы работаете с Go и вам нужно быстрое и масштабируемое решение для веб-скрейпинга, Geziyor определенно стоит рассмотреть.

Похожие записи