CoderCastrov logo
CoderCastrov
Питон

Как Golang может сэкономить вам дни парсинга веб-сайтов

Как Golang может сэкономить вам дни парсинга веб-сайтов
просмотров
2 мин чтение
#Питон
Table Of Content

Сравнение между Python и Golang для парсинга веб-сайтов.

Большинство парсинга данных происходит с использованием Python. Python предлагает большой набор библиотек и имеет много документации, что делает разработку парсеров и краулеров простой. Но является ли он лучшим языком для парсинга веб-сайтов?

В этом блоге мы сравним Python и Golang для парсинга веб-сайтов, создав парсеры на обоих языках и сравнив время выполнения и точность парсинга.

Эксперимент

Для этого эксперимента мы будем парсить цены акций с Yahoo Finance. В Python мы будем использовать библиотеку BeautifulSoup для парсинга вместе с ThreadPoolExecutor для запуска парсинга в нескольких потоках.

BeautifulSoup - это легкая библиотека Python для парсинга и анализа структурированных данных с статических веб-сайтов.

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)

soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="ResultsContainer")
job_elements = results.find_all("div", class_="card-content")

Этот фрагмент кода объясняет, как просто содержимое HTML-страницы передается объекту BeautifulSoup, и затем мы можем распарсить любые данные, которые нам нужны.

ThreadPoolExecutor в Python управляет пулом потоков за нас. Мы можем указать количество одновременных рабочих, которое мы хотим, и должны указать функцию, которая будет вызываться каждый раз вместе с списком данных, которые будут использоваться.

def download_all_sites(sites):
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        executor.map(download_site, sites)

Здесь download_site - это функция, которая будет вызываться для каждого элемента в списке sites.


Для Golang мы будем использовать Goquery для парсинга вместе с горутинами для многопоточности. Goquery - это библиотека Golang для парсинга данных, очень похожая на jQuery.

func ExampleScrape() {
    // Запросить HTML-страницу.
    res, err := http.Get("https://finance.yahoo.com/quote/ORCL")
    // Загрузить HTML-документ
    doc, err := goquery.NewDocumentFromReader(res.Body)
    // Найти элементы обзора
    doc.Find("#quote-header-info").Each(func(i int, s *goquery.Selection) {
        // Для каждого найденного элемента получить имя.
        name := s.Find("h1").Text()
        fmt.Println(name)
    })
}

func main() {
    ExampleScrape()
}

Эта функция выполняет GET-запрос, передает тело HTML в объект Goquery и парсит необходимые данные.

Горутины в Go - это легковесные потоки, управляемые средой выполнения Go.

// Внутри кода, вызывающего функцию f.
go f(x, y, z)

Здесь функция f(x, y, z) будет выполняться в новой горутине.


Полный код доступен здесь.

В коде мы можем указать количество акций, которые мы хотим спарсить (количество URL) и количество потоков, которые мы хотим использовать.