Как Golang может сэкономить вам дни парсинга веб-сайтов
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) и количество потоков, которые мы хотим использовать.