Парсинг данных на Python: от новичка до профи

Этот курс охватывает полный путь разработки веб-скрейперов: от простых запросов до сложных систем сбора данных. Вы научитесь работать с динамическим контентом, обходить защиты и масштабировать свои проекты с помощью современных инструментов.

1. Основы веб-скрейпинга: протокол HTTP, библиотека Requests и парсинг HTML с BeautifulSoup

Основы веб-скрейпинга: протокол HTTP, библиотека Requests и парсинг HTML с BeautifulSoup

Добро пожаловать в курс «Парсинг данных на Python: от новичка до профи». Это первая статья, и мы начнем наше путешествие с фундаментальных основ. Прежде чем писать сложных ботов или анализировать большие данные, необходимо понять, как работает интернет и как мы можем взаимодействовать с ним, используя код.

Веб-скрейпинг (или парсинг) — это автоматизированный процесс сбора данных с веб-сайтов. Представьте, что вы нанимаете робота, который открывает сотни страниц в секунду, читает их содержимое и аккуратно складывает нужную информацию в таблицу. Именно этого робота мы и научимся создавать.

Как общаются компьютеры: Протокол HTTP

Когда вы открываете браузер и вводите адрес сайта, происходит магия, скрытая от глаз пользователя. На самом деле, ваш браузер (клиент) отправляет сообщение удаленному компьютеру (серверу), а сервер отвечает ему.

Этот обмен сообщениями регулируется протоколом HTTP (HyperText Transfer Protocol). Понимание HTTP — это 50% успеха в парсинге.

!Иллюстрация базового принципа работы интернета: обмен запросами и ответами между клиентом и сервером.

Структура запроса (Request)

Когда мы «стучимся» на сервер, мы используем определенные методы. Для парсинга наиболее важны два из них:

  • GET — просьба получить данные. Это происходит, когда вы просто открываете страницу или переходите по ссылке.
  • POST — просьба отправить данные на сервер. Это происходит, когда вы заполняете форму логина или регистрации.
  • Структура ответа (Response)

    Сервер всегда отвечает, даже если что-то пошло не так. Самая важная часть ответа для нас — это код состояния (Status Code). Это трехзначное число, сообщающее результат операции:

    * 200 OK: Все отлично, запрос успешен, данные получены. * 403 Forbidden: Доступ запрещен. Часто означает, что сайт понял, что вы робот, и заблокировал вас. * 404 Not Found: Страница не найдена. * 500 Internal Server Error: Ошибка на самом сервере.

    Инструмент №1: Библиотека Requests

    Python — идеальный язык для парсинга благодаря своей экосистеме. Для отправки HTTP-запросов стандартом индустрии является библиотека Requests. Она позволяет вашему скрипту притвориться браузером.

    Установка

    Для начала работы необходимо установить библиотеку через терминал:

    Ваш первый запрос

    Давайте попробуем получить данные с реального сайта. Мы будем использовать специальный ресурс для тренировки парсинга — Quotes to Scrape.

    В переменной response.text хранится весь HTML-код страницы. Для человека это просто набор символов, но именно здесь лежат данные, которые мы хотим извлечь.

    Маскировка под человека (User-Agent)

    Многие сайты не любят ботов. Если вы отправите запрос «голым» Python-скриптом, сервер увидит, что к нему обращается программа (в заголовках запроса будет написано python-requests). Чтобы избежать блокировки, мы подменяем заголовок User-Agent.

    Теперь сервер думает, что мы — обычный пользователь браузера Chrome.

    Анатомия веб-страницы: HTML

    Получить код страницы — это только полдела. Теперь нужно найти в нем полезную информацию. Веб-страницы строятся на языке разметки HTML (HyperText Markup Language).

    HTML состоит из тегов, которые образуют иерархическую структуру, похожую на дерево (DOM — Document Object Model).

    !Схематичное изображение того, как элементы HTML вложены друг в друга, образуя структуру страницы.

    Пример простого HTML:

    Здесь: * div, span, small — это теги. * class="quote" — это атрибут. * Текст внутри тегов — это контент.

    Наша задача: найти нужный тег по его имени или атрибутам и забрать контент.

    Инструмент №2: BeautifulSoup

    Разбирать HTML-код вручную, используя строковые методы Python — это мучение. Для этого существует библиотека BeautifulSoup (из пакета bs4). Она превращает «кашу» из HTML-текста в удобный объект, по которому можно навигировать.

    Установка

    Основные методы поиска

    Создадим объект «супа»:

    Теперь у нас есть два главных инструмента поиска:

  • find(tag, attributes) — находит первый попавшийся элемент, удовлетворяющий условиям.
  • find_all(tag, attributes) — находит все элементы и возвращает их список.
  • Практика: Парсим цитаты

    Давайте объединим requests и BeautifulSoup, чтобы собрать цитаты и их авторов с сайта.

    Как получить значение атрибута?

    Иногда нам нужен не текст, а ссылка (например, на страницу автора). Ссылки хранятся в атрибуте href тега <a>.

    Резюме

    Мы сделали первый и самый важный шаг в веб-скрейпинге. Теперь вы знаете, что:

  • HTTP — это язык общения клиента и сервера.
  • Requests — библиотека Python для отправки запросов и получения «сырого» HTML.
  • HTML — это дерево тегов, в котором хранятся данные.
  • BeautifulSoup — библиотека для поиска и извлечения данных из HTML-дерева.
  • В следующих статьях мы разберем, как работать с динамическими сайтами, обходить сложные защиты и сохранять данные в удобные форматы (CSV, JSON, Базы данных).

    > "Данные — это новая нефть." — Клайв Хамби, The Guardian

    2. Работа с динамическим контентом: автоматизация браузеров через Selenium и Playwright

    Работа с динамическим контентом: автоматизация браузеров через Selenium и Playwright

    В предыдущей статье мы научились отправлять HTTP-запросы с помощью библиотеки requests и разбирать HTML-код, используя BeautifulSoup. Это мощная связка, которая покрывает около 60-70% задач по сбору данных. Но что делать, если вы скачали страницу, открыли её код, а там... пустота?

    Или, например, вы видите на сайте список товаров, но в HTML-коде, полученном через Python, этих товаров нет. Почему так происходит? Добро пожаловать в мир динамического контента и JavaScript.

    Проблема: JavaScript и динамический рендеринг

    Классический веб (Web 1.0) работал просто: сервер формировал готовую HTML-страницу и отдавал её браузеру. Библиотека requests работает именно так: она скачивает то, что отдал сервер.

    Однако современные сайты (Web 2.0 и Web 3.0) устроены иначе. Часто сервер отдаёт лишь «скелет» страницы (пустые блоки), а наполнение контентом происходит уже в вашем браузере с помощью JavaScript. Браузер получает данные отдельно (часто в формате JSON) и «дорисовывает» страницу на лету. Это называется Client-Side Rendering (CSR).

    !Слева показан классический процесс загрузки статического сайта, справа — процесс загрузки динамического сайта с использованием JavaScript.

    Если вы попытаетесь спарсить такой сайт через requests, вы получите пустой каркас без данных. Чтобы получить данные, нам нужно научить наш скрипт вести себя как настоящий браузер: выполнять JavaScript, кликать по кнопкам и ждать загрузки элементов.

    Для этого мы используем инструменты автоматизации браузеров. Два титана в этой области — Selenium и Playwright.

    Инструмент №1: Selenium WebDriver

    Selenium — это ветеран автоматизации. Изначально созданный для тестирования веб-приложений, он стал стандартом де-факто для парсинга сложных сайтов. Он позволяет управлять реальным браузером (Chrome, Firefox) через код.

    Установка

    Вам понадобится сама библиотека и драйвер для браузера.

    Раньше нужно было вручную скачивать драйверы (например, chromedriver), но в свежих версиях Selenium (4.x) это часто происходит автоматически или требует минимальной настройки.

    Ваш первый робот на Selenium

    Давайте напишем скрипт, который открывает сайт, находит поле поиска и вводит туда текст. Для примера возьмем тот же Quotes to Scrape, но его JavaScript-версию (обратите внимание на /js/ в адресе).

    Ожидания (Waits): Главный секрет стабильности

    В примере выше мы использовали time.sleep(2). В реальном парсинге это строго запрещено. Почему? * Если интернет быстрый, сайт загрузится за 0.5 сек, и вы потеряете 1.5 сек впустую. * Если интернет медленный, сайт загрузится за 3 сек, скрипт сработает раньше и упадет с ошибкой.

    В Selenium нужно использовать явные ожидания (Explicit Waits). Мы говорим драйверу: «Жди, пока кнопка не появится, но не больше 10 секунд».

    Плюсы и минусы Selenium

    * Плюсы: Огромное сообщество, поддержка всех браузеров, много документации. * Минусы: Медленный, потребляет много оперативной памяти, требует сложной настройки ожиданий, код получается громоздким.

    Инструмент №2: Playwright

    Playwright — это современный инструмент от Microsoft. Он новее, быстрее и надежнее Selenium. Он умеет «из коробки» то, ради чего в Selenium приходится писать десятки строк кода.

    Установка

    Команда playwright install скачивает специальные версии браузеров, оптимизированные для автоматизации.

    Пример на Playwright

    Посмотрите, насколько код лаконичнее. Playwright умеет работать как в асинхронном, так и в синхронном режиме. Для простоты начнем с синхронного.

    Киллер-фичи Playwright

  • Авто-ожидание (Auto-wait): Playwright сам ждет, пока элемент станет кликабельным или видимым, прежде чем взаимодействовать с ним. Забудьте про time.sleep().
  • Генератор кода: Вы можете запустить команду playwright codegen wikipedia.org, походить по сайту, и Playwright сам напишет за вас код парсера.
  • Скорость: Он работает значительно быстрее Selenium благодаря использованию протокола DevTools.
  • Сетевой перехват: Вы можете легко перехватывать сетевые запросы (XHR/Fetch), чтобы забирать чистые JSON-данные, минуя парсинг HTML.
  • Режим Headless: Парсинг-невидимка

    Когда вы запускаете браузер, вы обычно видите его окно. Это удобно для отладки. Но когда скрипт запускается на сервере, монитора там нет. Кроме того, отрисовка графики тратит ресурсы процессора.

    Для этого существует Headless mode (безголовый режим). Браузер работает в фоновом режиме, выполняет весь JS, но ничего не рисует на экране.

    В Selenium:

    В Playwright:

    Что выбрать: Selenium или Playwright?

    | Характеристика | Selenium | Playwright | | :--- | :--- | :--- | | Возраст | Старый (2004), проверенный | Новый (2020), современный | | Скорость | Средняя | Высокая | | Сложность кода | Высокая (много бойлерплейта) | Низкая (лаконичный API) | | Ожидания | Нужно писать вручную | Автоматические | | Поддержка | Огромная база знаний | Быстро растущая |

    Рекомендация: Если вы начинаете новый проект с нуля — выбирайте Playwright. Если вам нужно поддерживать старый корпоративный проект — скорее всего, там будет Selenium.

    Практический кейс: Бесконечный скролл

    Многие сайты (VK, YouTube, Pinterest) подгружают контент, когда вы листаете страницу вниз. requests здесь бессилен. В браузере же мы можем эмулировать нажатие клавиши End или прокрутку колесиком.

    Пример логики на Playwright:

    Мы выполняем JavaScript-код прямо в контексте страницы через метод evaluate. Это открывает безграничные возможности: вы можете менять стили, удалять рекламные баннеры, чтобы они не мешали кликам, и извлекать данные из глобальных переменных JS.

    Резюме

    Сегодня мы сделали огромный шаг вперед. Теперь для вас не существует «недоступных» сайтов.

  • Динамические сайты требуют выполнения JavaScript, с чем не справляется обычный requests.
  • Selenium — классический инструмент для управления браузером, мощный, но требующий тщательной настройки ожиданий.
  • Playwright — современная альтернатива, быстрая, с автоматическими ожиданиями и удобным API.
  • Headless режим позволяет экономить ресурсы, запуская браузер без графического интерфейса.
  • В следующей статье мы углубимся в тему, о которой часто забывают новички, но которая критически важна для промышленного парсинга: как не получить бан. Мы поговорим про ротацию User-Agent, использование прокси-серверов и паттерны поведения ботов.

    > "Автоматизация — это не замена человека, а освобождение его от рутины для более великих дел." — Неизвестный автор

    3. Продвинутые техники: анализ сетевого трафика, работа со скрытыми API и управление сессиями

    Продвинутые техники: анализ сетевого трафика, работа со скрытыми API и управление сессиями

    В предыдущих частях курса мы прошли путь от простых запросов с requests до управления полноценными браузерами через Selenium и Playwright. Казалось бы, инструментарий полон. Если сайт простой — берем requests, если сложный и динамический — запускаем браузер.

    Но есть третий путь. Путь, который выбирают профессионалы. Он позволяет собирать данные с динамических сайтов так же быстро, как requests, но без тяжеловесности и медлительности Selenium. Этот путь — работа со скрытыми API.

    Что такое скрытый API?

    Когда вы заходите на современный сайт (например, маркетплейс) и листаете страницу вниз, новые товары подгружаются автоматически. Вы уже знаете, что это работает через JavaScript. Но откуда JavaScript берет эти данные?

    Он не придумывает их. Он отправляет скрытый запрос на сервер, получает в ответ чистые данные (обычно в формате JSON) и красиво отрисовывает их в браузере.

    Скрытый API (Internal API) — это те самые «служебные» ручки (endpoints), к которым обращается фронтенд сайта для получения данных. Если мы найдем адрес этого запроса и сможем его повторить, нам не нужно будет парсить HTML. Мы получим структурированные данные напрямую от сервера.

    Преимущества этого метода

  • Скорость. Мы не грузим картинки, стили и скрипты. Мы получаем только текст данных. Это в 10-100 раз быстрее Selenium.
  • Стабильность. HTML-верстка меняется часто (дизайнеры двигают кнопки), а структура JSON-ответов меняется редко (это требует переписывания бэкенда).
  • Чистота данных. Вам не нужно вычищать текст от лишних пробелов и тегов <span>. Вы получаете готовые числа и строки.
  • Инструмент разведчика: DevTools Network

    Ваш главный друг в поиске скрытых API — вкладка Network в инструментах разработчика браузера.

    !Интерфейс вкладки Network в инструментах разработчика, где происходит анализ трафика.

    Алгоритм поиска API

  • Откройте целевой сайт в браузере (Chrome/Firefox).
  • Нажмите F12 или ПКМ -> Просмотреть код, перейдите на вкладку Network.
  • В фильтрах выберите Fetch/XHR. Это отсеет картинки, шрифты и CSS, оставив только запросы данных (AJAX-запросы).
  • Совершите действие на сайте, которое подгружает данные (нажмите кнопку «Показать еще», пролистайте страницу, воспользуйтесь поиском или фильтрами).
  • Следите за списком запросов. Тот, который появится в момент действия, скорее всего, и есть наша цель.
  • Анатомия запроса

    Когда вы нашли подозрительный запрос, кликните по нему. Вам откроется панель с деталями, разделенная на несколько вкладок. Для парсинга критически важны три из них:

    1. Headers (Заголовки)

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

    * Request URL: Куда отправлять запрос. * Request Method: Тип запроса (обычно GET или POST). * User-Agent: Идентификатор браузера. * Referer / Origin: Откуда пришел запрос (некоторые сайты блокируют запросы без правильного Referer). * Cookie: Если сайт требует авторизации или отслеживает сессию, куки будут здесь.

    2. Payload (Полезная нагрузка)

    Эта вкладка появляется для POST-запросов. Здесь видно, какие параметры мы передаем серверу. Это могут быть:

    * Номера страниц (page: 2). * ID категорий (category_id: 12345). * Фильтры (price_min: 1000, sort: 'desc').

    Данные могут передаваться как Form Data (как обычная форма) или Request Payload (чистый JSON). Это важно учитывать при написании кода.

    3. Preview / Response (Ответ)

    Здесь мы видим то, что вернул сервер. Если вы видите красивое дерево JSON с нужными вам данными (ценами, названиями, ссылками) — поздравляю, вы нашли API.

    Реализация на Python

    Допустим, мы нашли запрос, который возвращает список товаров. Попробуем повторить его с помощью библиотеки requests.

    Простой пример

    Если запрос был методом POST, мы используем аргумент json (для JSON payload) или data (для Form Data):

    Управление сессиями (Session Management)

    Часто одного запроса недостаточно. Сайт может требовать, чтобы вы сначала «зашли» на главную страницу, получили специальные Cookies, и только потом делали запрос к API. Или же вам нужно авторизоваться.

    Если вы используете обычный requests.get(), каждый вызов — это как новый браузер в режиме инкогнито. Он ничего не помнит о предыдущих запросах.

    Для сохранения состояния (куки, заголовки авторизации) используется объект Session.

    Как работает requests.Session

    Сессия — это контекстный менеджер, который сохраняет куки между запросами. Это позволяет эмулировать поведение реального пользователя, который ходит по сайту.

    Зачем это нужно?

  • Авторизация. Вы отправляете POST-запрос с логином и паролем один раз. Сервер возвращает куку сессии. Объект session запоминает её, и дальше вы можете парсить закрытые разделы сайта.
  • Обход защиты. Некоторые сайты проверяют последовательность действий. Если вы сразу ломитесь в API без посещения главной страницы, вас могут заблокировать.
  • Эффективность. Сессия может переиспользовать TCP-соединение (Keep-Alive), что немного ускоряет серию запросов к одному хосту.
  • Лайфхак: cURL to Python

    Ручной перенос всех заголовков и параметров из DevTools в код может быть утомительным. Есть способ ускорить этот процесс:

  • В DevTools (Network) нажмите правой кнопкой мыши на нужный запрос.
  • Выберите Copy -> Copy as cURL (bash).
  • Зайдите на сайт curlconverter.com (или используйте аналогичную утилиту).
  • Вставьте cURL-команду. Сервис автоматически сгенерирует готовый код на Python с использованием requests.
  • Это отличная отправная точка. Полученный код можно почистить, убрать лишние заголовки и обернуть в функции.

    Резюме

    Работа со скрытыми API — это «золотой стандарт» парсинга. Прежде чем писать сложный парсер на Selenium, всегда тратьте 10-15 минут на разведку в DevTools. Если вы найдете JSON-источник данных, вы сэкономите часы разработки и получите более надежное решение.

    Используйте requests.Session для сложных сценариев, где важна последовательность действий и сохранение куки, и не забывайте маскироваться под браузер с помощью заголовков.

    4. Промышленный парсинг: фреймворк Scrapy, асинхронность с aiohttp и сохранение данных в БД

    Промышленный парсинг: фреймворк Scrapy, асинхронность с aiohttp и сохранение данных в БД

    Мы прошли долгий путь: от простых запросов через requests до управления полноценными браузерами с помощью Selenium и Playwright. Вы уже умеете извлекать данные практически с любого сайта. Но что, если ваша задача — собрать не сто цитат, а миллион товаров с маркетплейса или проиндексировать новостной архив за 10 лет?

    Здесь в игру вступает промышленный парсинг. Его главные критерии: скорость, отказоустойчивость и структурированное хранение данных. В этой статье мы разберем инструменты, которые используют профессионалы для масштабных задач.

    Проблема синхронного кода

    Представьте, что вы заказали пиццу в ресторане. Официант принял заказ, ушел на кухню и стоит там 20 минут, ожидая, пока пицца испечется. Только подав её вам, он идет к следующему столику. Это — синхронный подход (как работает библиотека requests). Пока программа ждет ответа от сервера, она блокируется и ничего не делает.

    Если один запрос занимает 1 секунду, то 1000 запросов займут 1000 секунд (почти 17 минут).

    В асинхронном подходе официант отдает заказ на кухню и сразу идет к следующему столику. Когда пицца готова, повар звонит в колокольчик, и официант забирает её. Программа не ждет ответа, а отправляет следующие запросы.

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

    Где — общее время, — количество запросов, а — время выполнения -го запроса.

    Для асинхронного выполнения (), при условии идеальной параллельности, время стремится к времени самого долгого запроса:

    Где — общее время асинхронного выполнения, а — максимальное время выполнения одного из запросов в пачке.

    Инструмент №1: aiohttp

    Для написания асинхронных парсеров в Python стандартом является библиотека aiohttp. Она работает в связке с модулем asyncio.

    Установка

    Пример асинхронного парсера

    Ключевые слова здесь — async (объявление асинхронной функции) и await (команда ждать результат, не блокируя выполнение других задач).

    Этот код выполнит 3 запроса практически за то же время, что и один. На больших объемах выигрыш в скорости колоссальный.

    Инструмент №2: Scrapy

    Если requests и aiohttp — это библиотеки (инструменты), то Scrapy — это фреймворк (завод). Он диктует вам, как писать код, но взамен берет на себя 90% рутины: многопоточность, обработку ошибок, ротацию User-Agent, экспорт данных и следование по ссылкам.

    !Архитектура Scrapy: взаимодействие компонентов фреймворка при обработке запроса.

    Установка и создание проекта

    Это создаст папку с готовой структурой проекта. Чтобы создать «паука» (скрипт для конкретного сайта), зайдите в папку проекта и введите:

    Анатомия Паука

    В файле spiders/quotes.py появится класс. Давайте научим его собирать цитаты.

    Запуск паука:

    Флаг -O quotes.json автоматически сохранит все данные в JSON-файл. Scrapy сам перейдет по всем страницам пагинации, пока они не закончатся.

    Сохранение данных: Базы данных

    При промышленном парсинге сохранять данные в CSV или JSON становится неудобно. Файлы трудно читать частями, сложно обновлять и невозможно эффективно искать в них информацию. Решение — Базы Данных (БД).

    Для Python самой простой и встроенной БД является SQLite. Это один файл, который ведет себя как полноценная SQL-база.

    Scrapy Pipelines

    В Scrapy есть специальное место для обработки и сохранения данных — Pipelines (файл pipelines.py). Данные попадают сюда после того, как паук их собрал.

    Пример пайплайна, который сохраняет цитаты в SQLite:

    Чтобы это заработало, нужно раскомментировать строки в файле settings.py в блоке ITEM_PIPELINES.

    Резюме

    Сегодня мы перешли в высшую лигу парсинга.

  • Асинхронность позволяет выполнять тысячи запросов одновременно, экономя часы времени.
  • aiohttp — отличный выбор для быстрых и легких скриптов.
  • Scrapy — мощный комбайн для сложных проектов, где нужна структура и масштабируемость.
  • Базы данных (SQLite, PostgreSQL) необходимы для надежного хранения больших объемов информации.
  • В следующей, заключительной части курса, мы поговорим о том, как развертывать ваших пауков на удаленных серверах, настраивать расписание запуска и мониторить их состояние.

    > "Преждевременная оптимизация — корень всех зол." — Дональд Кнут, The Art of Computer Programming

    5. Защита и деплой: ротация прокси, обход капчи, User-Agent и запуск парсеров в Docker

    Защита и деплой: ротация прокси, обход капчи, User-Agent и запуск парсеров в Docker

    Поздравляю! Если вы читаете эту статью, значит, вы уже умеете извлекать данные практически с любого сайта, будь то простой блог или сложный динамический маркетплейс. Вы освоили requests, BeautifulSoup, Selenium, Playwright и даже Scrapy.

    Но есть одна проблема. Написать парсер — это только половина дела. Вторая половина — заставить его работать стабильно и долго. Сайты не любят, когда их грабят. Они строят стены, ставят ловушки и нанимают охрану (анти-бот системы).

    В этой финальной статье курса мы разберем, как сделать вашего бота невидимым, неуязвимым и автономным.

    Линия обороны №1: Маскировка (User-Agent и заголовки)

    Самый простой способ, которым сайт вычисляет бота — это проверка его «паспорта». В мире HTTP роль паспорта играют заголовки (Headers), и главный из них — User-Agent.

    По умолчанию библиотека requests честно говорит: «Привет, я скрипт на Python» (python-requests/2.26.0). Большинство сайтов тут же блокируют такие запросы.

    Решение: Фейковые заголовки

    Мы уже касались этого в первой статье, но теперь углубимся. Просто скопировать свой User-Agent из браузера недостаточно. Если вы будете делать 1000 запросов в минуту с одного и того же «браузера», это вызовет подозрения.

    Нужно менять маски. Для этого существует библиотека fake-useragent.

    Пример использования:

    Каждый раз, запуская этот код, вы будете «превращаться» в разные браузеры и операционные системы.

    Линия обороны №2: IP-адрес и Прокси

    Даже если вы меняете User-Agent каждый запрос, ваш IP-адрес остается неизменным. Представьте, что в магазин заходят 100 разных людей, но у всех одно и то же лицо. Охрана быстро поймет, что это маскарад.

    Сайты устанавливают лимиты (Rate Limits). Например: «Не более 60 запросов в минуту с одного IP».

    Чтобы обойти это ограничение, нам нужны Прокси-серверы (Proxies). Это промежуточные компьютеры, через которые мы пускаем трафик. Сайт видит IP прокси, а не ваш реальный адрес.

    !Иллюстрация того, как прокси скрывают реальный IP-адрес источника запроса, распределяя трафик через промежуточные узлы.

    Математика распределения нагрузки

    Эффективность использования пула прокси можно описать простой формулой распределения нагрузки:

    Где: * — нагрузка на один IP-адрес (запросов в минуту). * — общее количество запросов, которое вам нужно сделать в минуту. * — количество прокси в вашем пуле.

    Если сайту разрешено делать 10 запросов в минуту (), а вам нужно собрать 1000 страниц (), то вам понадобится минимум:

    То есть 100 прокси-серверов.

    Типы прокси

  • Серверные (Datacenter): Дешевые, быстрые, но их IP принадлежат хостинг-провайдерам (AWS, DigitalOcean). Сайты часто банят целые подсети таких IP.
  • Резидентские (Residential): Дорогие, медленнее, но это IP реальных пользователей (домашний Wi-Fi, мобильный интернет). Их блокируют крайне редко, так как сайт боится забанить живого человека.
  • Для серьезных задач лучше использовать резидентские прокси с ротацией (когда провайдер сам меняет IP на каждый ваш запрос).

    Пример с requests:

    Линия обороны №3: Капча (CAPTCHA)

    Вы меняете User-Agent, используете дорогие прокси, но вдруг сайт выдает картинку со светофорами или искаженным текстом. Это CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart).

    Пытаться решить капчу самостоятельно с помощью нейросетей — задача интересная, но невероятно сложная и дорогая. В промышленном парсинге используют сервисы ручного распознавания (2Captcha, AntiCaptcha, RuCaptcha).

    Как это работает?

  • Ваш парсер встречает капчу и скачивает картинку (или получает специальный ключ сайта для ReCaptcha).
  • Парсер отправляет эти данные через API на сервис решения.
  • Там реальный человек (воркер) решает капчу за копейки.
  • Сервис возвращает вам ответ (текст или токен).
  • Вы вводите ответ на сайте и продолжаете работу.
  • Это занимает от 5 до 20 секунд и стоит около 0.5–2 или мощный кластер Amazon AWS.

    Заключение курса

    Мы прошли большой путь. Вы начали с простых запросов, научились управлять браузерами, освоили асинхронность, базы данных и теперь знаете, как защитить и развернуть своих ботов.

    Парсинг — это постоянная гонка вооружений. Сайты придумывают новые защиты, парсеры — новые методы обхода. Главное правило профи: уважайте чужой ресурс. Не создавайте DDoS-атаки, парсите только то, что нужно, и соблюдайте этические нормы.

    Ваши данные ждут вас. Удачи в коде!

    > "Тот, кто владеет информацией — владеет миром." — Натан Ротшильд