Открытый исходный код, это среда, в которой по-настоящему живёт веб-скрапинг. Инструменты для загрузки страниц, разбора разметки и управления браузерами в подавляющем большинстве случаев являются бесплатными проектами, которые поддерживаются сообществом, и лучшие из них прошли проверку миллионами реальных скрапинговых задач на протяжении многих лет. Вы можете читать исходный код, создавать задачи, заменять одни компоненты другими и никогда не платить за лицензию на уровне парсера. Эта открытость также объясняет быстрое развитие отрасли: набор инструментов, актуальный в 2018 году, кардинально отличается от сегодняшнего.
В этом обзоре рассматриваются восемь библиотек с открытым исходным кодом для скрапинга, которые охватывают подавляющее большинство реальных задач сегодня: на Python, JavaScript и уровне автоматизации браузера, находящемся над ними обоими. По каждой библиотеке вы узнаете, что это такое, на каком языке она написана, в чём её сильные стороны и когда именно к ней стоит обращаться, с коротким фрагментом кода там, где строка кода говорит яснее абзаца. Сводная таблица в конце соотносит каждую библиотеку с задачей, которой она владеет, чтобы вы могли подобрать правильный стек вместо того, чтобы по умолчанию использовать то, что применяли в прошлый раз.
Почему открытый исходный код для скрапинга?
Скрапинг редко требует одного инструмента. Вы выбираете загрузчик для получения HTML, парсер для извлечения данных из него и (когда страница существует только после выполнения JavaScript) уровень автоматизации браузера для её рендеринга. Библиотеки с открытым исходным кодом заполняют каждый из этих слотов, и поскольку они модульные, вы можете свободно их комбинировать: загрузчик на Python с парсером на Python или браузерный драйвер на Node, передающий данные лёгкой DOM-библиотеке. В результате вы получаете стек, который собираете сами, а не готовый продукт.
Практические причины опираться на открытый исходный код выходят за рамки стоимости. Зрелые проекты, такие как Scrapy и Beautiful Soup, за многие годы уже решили множество граничных случаев, имеют крупные сообщества, отвечающие на вопросы, и достаточно глубокую документацию для адаптации новичков. Вы не привязаны к дорожной карте вендора, и когда целевой сайт меняет разметку, вы можете исправить свои селекторы в тот же день. Приведённые ниже библиотеки заслужили это доверие, расположенные примерно от наиболее распространённых инструментов для разбора и загрузки до более тяжёлых вариантов автоматизации браузера.
Beautiful Soup (Python)
Beautiful Soup, классический HTML-парсер на Python, актуальный релиз, Beautiful Soup 4. Его популярность объясняется одним качеством: он корректно справляется с некорректной разметкой. Реальный HTML переполнен незакрытыми тегами и нарушенной вложенностью, а Beautiful Soup превращает даже запутанные документы в навигируемое дерево объектов Python, по которому можно искать по тегу, классу или атрибуту. API читается почти как простой английский язык, что делает его обычным первым парсером для начинающих.
Обращайтесь к Beautiful Soup, когда разметка нестандартна, проект небольшой или средний, или когда читаемость важнее скорости. Сам по себе он не загружает страницы, поэтому используется в паре с HTTP-клиентом и медленнее lxml на очень больших документах. В большинстве задач скрапинга это различие несущественно. Наше руководство по Beautiful Soup на Python подробнее рассматривает его селекторы и навигацию по дереву.
from bs4 import BeautifulSoup soup = BeautifulSoup(html, "html.parser") title = soup.find("h1").text links = [a["href"] for a in soup.select("a[href]")]
Scrapy (Python)
Scrapy, это не парсер, а полноценный фреймворк для краулинга, и он по-прежнему остаётся выбором номер один для Python-разработчиков, создающих скраперы в промышленном масштабе. Там, где большинство библиотек выполняют одну функцию, Scrapy даёт вам весь конвейер: асинхронный движок для параллельной загрузки множества страниц, планировщик запросов, переход по ссылкам, повторные попытки и встроенный экспорт структурированных данных в JSON, CSV или XML. Он создан для проектов, которые обходят большое количество страниц и нуждаются в организации работы в виде пауков, определений элементов и конвейеров обработки, а не одного скрипта.
Обращайтесь к Scrapy, когда масштаб и структура являются приоритетами: повторяющиеся краулы, тысячи URL или данные, которые должны проходить через этапы очистки и хранения. Цена этой мощи, более крутая кривая обучения и больше настроек по сравнению с быстрым скриптом для загрузки и разбора, поэтому для разового использования это избыточно. Он портируем между Linux, Windows и BSD, имеет крупное сообщество и достаточно расширяем, чтобы добавлять новое поведение без изменения ядра. Как и обычный HTTP-клиент, Scrapy без дополнений не выполняет JavaScript, хотя он интегрируется с браузерными инструментами, когда целевой сайт требует рендеринга.
import scrapy class BookSpider(scrapy.Spider): name = "books" start_urls = ["https://books.toscrape.com"] def parse(self, response): for book in response.css("article.product_pod"): yield {"title": book.css("h3 a::attr(title)").get()}
lxml (Python)
lxml, самый быстрый вариант среди Python-парсеров. Построенный на C-библиотеках libxml2 и libxslt, он разбирает большие HTML- и XML-документы значительно быстрее, чем парсер на чистом Python, и предлагает полную поддержку XPath 1.0, что даёт возможность делать точные и выразительные запросы к глубоко вложенной разметке. При обработке тысяч документов или извлечении данных из структурированных XML-фидов это различие в производительности становится решающим фактором выбора.
Обращайтесь к lxml, когда важна скорость, документы большие или вы хотите использовать XPath вместо CSS-селекторов. Компромисс состоит в том, что он строже Beautiful Soup, поэтому очень некорректная разметка может вызвать проблемы, а API немного менее дружелюбен для начинающих. Многие команды используют обе библиотеки: lxml в качестве базового парсера Beautiful Soup, что даёт лучшее из обоих подходов: гибкую навигацию и быстрый разбор. Если вы выбираете стиль запросов, статья об XPath и CSS-селекторах сравнивает их напрямую.
Requests и HTTPX (Python)
Requests, HTTP-клиент, с которого начинает большинство Python-скраперов. Он хорошо справляется с одной задачей: отправить запрос и вернуть ответ, с сессиями, куками, заголовками и перенаправлениями через чистый API. Он не разбирает HTML и не выполняет JavaScript, поэтому сам по себе видит только исходную разметку, которую возвращает сервер. Для статических страниц, публичных каталогов и любых эндпоинтов, возвращающих HTML или JSON напрямую, этого вполне достаточно, а работает он быстро, поскольку нет накладных расходов браузера.
HTTPX, современный компаньон, о котором стоит знать: API, почти совместимый с Requests, который добавляет нативную поддержку async и HTTP/2, что важно, когда вы хотите отправлять много запросов параллельно без создания полноценного фреймворка. Используйте любой из них в качестве слоя загрузки, когда нужный контент присутствует в исходном ответе, а затем паруйте с Beautiful Soup или lxml для преобразования ответа в структурированные данные. Общее ограничение, обратная сторона их скорости: ни один из них не может скрапить страницы, которые создают содержимое с помощью JavaScript на стороне клиента, поскольку ни один из них не выполняет никакого кода.
import requests resp = requests.get("https://example.com") print(resp.status_code) # 200 html = resp.text # raw HTML, ready to parse
Cheerio (JavaScript)
Cheerio, быстрый, лёгкий HTML-парсер для Node.js, духовный преемник более старых инструментов для скрапинга на Node, опиравшихся на выборку в стиле jQuery. Он реализует знакомый, jQuery-подобный API поверх разобранного DOM, поэтому вы выбираете элементы теми же селекторами, что использовали бы в браузере, но без его накладных расходов. Одна из его главных особенностей, возможность быстро выбирать элементы из документа без написания сложных регулярных выражений, что упрощает извлечение и делает код читаемым.
Обращайтесь к Cheerio, когда вы работаете со скрапингом на JavaScript и содержимое страницы присутствует в серверно-рендеренном HTML. Это чисто парсер, поэтому он используется в паре с вызовом fetch (встроенный fetch, axios или аналог) для предварительного получения разметки, и, как любой статический парсер, он не выполняет клиентские скрипты. Для динамических страниц нужен полноценный браузерный инструмент. Наше руководство о том, как создать веб-скрапер на Node.js, показывает Cheerio в полном рабочем процессе.
const cheerio = require("cheerio"); const $ = cheerio.load(html); const title = $("h1").text(); const links = $("a[href]").map((i, el) => $(el).attr("href")).get();
Selenium (несколько языков)
Selenium, это автоматизация браузера, и это наиболее широко поддерживаемый и задокументированный вариант в своей категории. Он управляет реальным браузером (Chrome, Firefox и другими), поэтому страница загружается именно так, как её увидит пользователь, включая JavaScript. Это делает его решением для динамических сайтов, где скачанный HTML почти пуст до тех пор, пока скрипты не выполнятся и не добавят содержимое. Поскольку он управляет настоящим браузером, он также может нажимать на кнопки, заполнять формы, прокручивать страницу и ждать появления элементов, что необходимо для контента, который загружается только после взаимодействия. Его протокол WebDriver имеет привязки для Python, Java, JavaScript, Ruby и C#, поэтому он подходит почти под любой стек.
Обращайтесь к Selenium, когда целевой сайт рендерится на стороне клиента и обычный запрос не возвращает полезных данных, или когда вам нужно имитировать реального пользователя в нескольких шагах. Компромисс, это вес: запуск браузера медленнее и требует больше ресурсов, чем HTTP-запрос. Используйте его только там, где рендеринг действительно необходим, и сохраняйте более лёгкий стек загрузки и разбора для всего статического. Более широкий паттерн рассмотрен в статье о краулинге JavaScript-сайтов.
Автоматизация браузера решает проблему рендеринга, но не решает проблему блокировок, а это обычно следующая стена, на которую вы натыкаетесь. Какую бы библиотеку с открытым исходным кодом вы ни использовали для разбора, Crawlbase Crawling API может находиться под ней в качестве слоя загрузки: вы отправляете URL, а он на своей стороне обрабатывает ротацию IP, рендеринг в браузере для JavaScript-тяжёлых страниц и повторные попытки при блокировках, затем возвращает чистый HTML прямо в Beautiful Soup, lxml, Cheerio или паук Scrapy. Он работает совместно с вашим стеком, а не заменяет его, поэтому вы сохраняете логику разбора и прекращаете поддерживать антиблокировочную инфраструктуру.
Playwright (несколько языков)
Playwright, современная библиотека автоматизации браузера, созданная Microsoft и предназначенная для управления Chromium, Firefox и WebKit через единый API. По сравнению со старыми инструментами она делает ставку на авто-ожидание: приостанавливается в ожидании готовности элементов вместо того, чтобы заставлять вас добавлять паузы вручную, что делает скраперы динамических страниц заметно надёжнее. Она имеет официальные привязки для Python, JavaScript, Java и .NET и поддерживает безголовый или полноценный режим браузера из коробки.
Обращайтесь к Playwright, когда нужно скрапить JavaScript-тяжёлые или интерактивные сайты и вы хотите получить более чистый и стабильный опыт, чем предоставляют более старые инструменты автоматизации. Он выполняет ту же фундаментальную задачу, что и Selenium: рендерит реальные страницы и поддерживает клики, заполнение форм и навигацию, с более современным API, который многие команды находят более быстрым для написания и отладки. Стоимость та же, что и у любого инструмента рендеринга: накладные расходы браузера. Наше руководство по веб-скрапингу с Playwright охватывает полную настройку.
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://example.com") html = page.content() # fully rendered DOM browser.close()
Puppeteer (JavaScript)
Puppeteer, библиотека автоматизации браузера для Node.js, которая популяризировала безголовый Chrome для скрапинга и тестирования. Поддерживаемый командой Chrome, он даёт вам точный контроль над браузером Chromium через JavaScript: навигация, ожидание селекторов, выполнение кода внутри страницы, перехват сетевых запросов и создание скриншотов или PDF. Для разработчиков на JavaScript, которые хотят работать на одном языке от начала до конца, это естественный инструмент рендеринга.
Обращайтесь к Puppeteer, когда ваш стек, Node.js и вам нужно рендерить динамические страницы или взаимодействовать с ними. По умолчанию он ориентирован на Chromium, тогда как Playwright охватывает три браузерных движка, поэтому выбор часто сводится к тому, важна ли вам кросс-браузерная совместимость. Как и с любым браузерным инструментом, ожидайте более высокого потребления ресурсов по сравнению с обычным HTTP-запросом, и используйте его только для страниц, которым действительно нужен настоящий браузер.
Эти два инструмента во многом пересекаются для задач скрапинга. Puppeteer, устоявшийся выбор для Node.js и Chromium с большой базой примеров, тогда как Playwright добавляет первоклассную поддержку нескольких браузеров, больше языковых привязок и встроенное авто-ожидание. Если вы уже на Node и работаете только с Chromium, Puppeteer, хороший вариант по умолчанию. Если вам нужны Firefox и WebKit или вы пишете на Python, Playwright обычно проще.
Библиотеки в сравнении
Эти восемь инструментов занимают небольшое количество слотов: загрузить HTML, разобрать его или отрендерить с помощью реального браузера. Эта таблица сопоставляет каждую библиотеку с языком, на котором она написана, и задачей, которой она владеет, чтобы вы могли соотнести с ней свой целевой сайт и собрать стек вместо того, чтобы гадать.
| Библиотека | Язык | Лучше всего для |
|---|---|---|
| Beautiful Soup | Python | Разбор неаккуратного или нестандартного HTML |
| Scrapy | Python | Крупномасштабные краулы и конвейеры |
| lxml | Python | Быстрый разбор, большие документы, XPath |
| Requests / HTTPX | Python | Загрузка статических страниц и API |
| Cheerio | JavaScript | Быстрый разбор в стиле jQuery в Node |
| Selenium | Несколько языков | Рендеринг динамических страниц и взаимодействие с ними |
| Playwright | Несколько языков | Современный рендеринг в нескольких браузерах |
| Puppeteer | JavaScript | Безголовый Chromium в Node |
Обратите внимание: ни одна строка не является ответом на все случаи жизни. Реальный скрапер комбинирует их: Requests плюс Beautiful Soup для статической работы на Python, Cheerio за вызовом fetch в Node, Scrapy когда краул разрастается, и Selenium, Playwright или Puppeteer, когда страница существует только после выполнения JavaScript. Навык состоит в том, чтобы подобрать инструмент под задачу, а не выбрать любимый.
Как выбрать правильную библиотеку
Три вопроса позволяют принять большинство решений. Во-первых, на каком языке ваш проект? Python имеет наиболее глубокую экосистему для скрапинга (Requests, Beautiful Soup, lxml, Scrapy), тогда как JavaScript использует Cheerio для разбора и Puppeteer для рендеринга. Selenium и Playwright охватывают несколько языков, поэтому подходят для обоих. Во-вторых, рендерит ли страница содержимое на стороне сервера или на стороне клиента? Статический HTML требует только загрузчика плюс парсера; страницы, которые создают себя с помощью JavaScript, требуют браузерного инструмента. В-третьих, каков масштаб? Разовая страница хочет лёгкий скрипт загрузки и разбора, тогда как тысячи страниц с очередями, повторными попытками и экспортом указывают на Scrapy.
Для начинающих Beautiful Soup и Cheerio имеют наиболее пологие кривые обучения и читаются близко к обычному языку. Для крупных или повторяющихся краулов структура Scrapy оправдывает себя. Для динамических целей начните с Playwright, если хотите современный API и поддержку нескольких браузеров, или с Puppeteer, если остаётесь в Node и Chromium. Подберите инструмент по ответам, и стек сложится сам собой.
Ответственный скрапинг
Каким бы стеком вы ни пользовались, скрапьте сдержанно. Уважайте условия использования сайта и его robots.txt, сосредоточьтесь на общедоступных данных, а не на чём-либо за логином, к которому вы не имеете права доступа, и держите частоту запросов разумной, чтобы не перегружать серверы, от которых вы зависите. Ответственный темп также практичен: мягкий, хорошо идентифицированный трафик значительно реже попадает под ограничение скорости или блокировку, чем агрессивный краул, поэтому хорошие манеры и надёжный скрапинг обычно указывают в одном направлении. Более широкий сценарий описан в статье о том, как скрапить сайты без блокировок.
Ключевые выводы
- Открытый исходный код владеет стеком. Загрузчики, парсеры и браузерные драйверы, обеспечивающие скрапинг, это бесплатные проекты, поддерживаемые сообществом, которые можно читать, расширять и комбинировать.
- Нет единственной лучшей библиотеки. Реальный скрапер сочетает загрузчик, парсер и иногда браузер, поэтому подбирайте каждый инструмент под задачу, а не выбирайте один любимый.
- Лидируют Python и JavaScript. Python привносит Requests, Beautiful Soup, lxml и Scrapy; JavaScript, Cheerio и Puppeteer; Selenium и Playwright охватывают оба языка.
- Рендерите только при необходимости. Используйте загрузчик и парсер для статических страниц и обращайтесь к Selenium, Playwright или Puppeteer только тогда, когда странице для отображения нужен JavaScript.
- Блокировки, отдельная проблема. Выбор правильной библиотеки делает ваш код корректным, но ротация, рендеринг в масштабе и повторные попытки находятся за пределами возможностей любого отдельного парсера.
Часто задаваемые вопросы
Что такое библиотеки для скрапинга с открытым исходным кодом?
Это бесплатные, поддерживаемые сообществом библиотеки кода, обрабатывающие строительные блоки веб-скрапинга: загрузку страниц по HTTP, разбор возвращаемого HTML или XML и (для динамических сайтов) управление реальным браузером для рендеринга JavaScript. Поскольку исходный код открыт, вы можете его проверить, расширить и объединить части из разных библиотек в один стек, не платя за слой разбора.
Какая библиотека с открытым исходным кодом лучше всего для веб-скрапинга?
Единственной лучшей не существует, поскольку они выполняют разные задачи. Для статических страниц на Python самый простой надёжный стек, Requests для загрузки плюс Beautiful Soup для разбора. Добавьте lxml для скорости или XPath, Scrapy для крупных краулов, и Selenium, Playwright или Puppeteer, когда цель рендерит содержимое только с JavaScript. В Node Cheerio обрабатывает разбор, а Puppeteer, рендеринг.
Какая лучшая библиотека для JavaScript-тяжёлых сайтов?
Используйте библиотеку автоматизации браузера, поскольку обычные HTTP-клиенты никогда не выполняют JavaScript. Selenium наиболее широко поддерживается и задокументирован, Playwright, современный вариант с поддержкой нескольких браузеров и авто-ожиданием, а Puppeteer, естественный выбор для проектов на Node.js, ориентированных на Chromium. Все три загружают страницу в реальном браузере, чтобы скрипты выполнились и добавили содержимое.
Что лучше использовать: Beautiful Soup или lxml?
Используйте Beautiful Soup, когда разметка нестандартна или важна читаемость, поскольку он корректно обрабатывает некорректный HTML и читается почти как обычный язык. Используйте lxml при разборе больших документов, когда нужна максимальная скорость или запросы XPath. Они не взаимоисключающие: lxml может служить базовым парсером Beautiful Soup, давая вам одновременно гибкую навигацию и быстрый разбор.
Справляются ли библиотеки с открытым исходным кодом с блокировками и CAPTCHA?
Как правило, нет. Библиотеки для разбора и краулинга извлекают и организуют данные, но оставаться незаблокированным при тысячах запросов, это отдельная задача: ротация IP, реалистичный темп, рендеринг в браузере и повторные попытки при сбоях. Эта работа выходит за рамки того, для чего создавалась любая отдельная библиотека скрапинга, поэтому команды часто сочетают открытый парсер с управляемым слоем загрузки, таким как API для краулинга.
Могу ли я смешивать библиотеки из разных языков в одном проекте?
Как правило, в рамках одного скрапера используется один язык, но библиотеки внутри него комбинируются свободно. Python-скрапер может использовать HTTPX для загрузки, Beautiful Soup или lxml для разбора и Playwright для рендеринга тех немногих страниц, которым нужен браузер. Node-скрапер сочетает вызов fetch с Cheerio и добавляет Puppeteer для динамических целей. Модульный дизайн этих библиотек именно и делает такую сборку простой.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
