Flipkart, одна из крупнейших платформ электронной коммерции Индии. Каждая страница товара на ней содержит структурированные данные, необходимые для отслеживания цен, мониторинга конкурентов и каталогических исследований: название товара, текущая цена, звёздный рейтинг, количество отзывов, а также блок характеристик и преимуществ. Проблема в том, что Flipkart отрисовывает эти страницы в браузере и защищает их от автоматизированного трафика, поэтому обычный HTTP-запрос возвращает почти пустую оболочку вместо нужных полей.
В этом руководстве показано, как надёжно парсить страницы товаров Flipkart с помощью Python. Вы создадите небольшой рабочий скрипт, который получает отрисованную страницу товара через Crawling API, парсит нужные поля с помощью BeautifulSoup и выводит чистую структурированную запись. Всё руководство ограничено публичными данными товаров, а раздел о легальности в конце, не шаблонный текст, поэтому прочитайте его, прежде чем направить это на реальный объём.
Что вы создадите
Скрипт на Python, который принимает публичный URL товара Flipkart, получает отрисованный HTML через Crawling API и извлекает структурированную запись товара. В качестве сквозного примера будем нацелены на одну страницу товара и извлекать следующие поля:
- Name название товара, например модель наушников с ключевой характеристикой.
- Price текущая цена продажи, показанная на странице.
- Rating средний звёздный рейтинг, например «4.3».
- Review count количество оценок или отзывов о товаре.
- Highlights маркированный список ключевых характеристик, показываемый Flipkart в верхней части страницы.
Почему обычный запрос не работает на Flipkart
Если запросить URL товара Flipkart с помощью обычного HTTP-клиента, вы получите ответ, в котором большинство видимых в браузере данных отсутствует. Против вас работают два фактора. Во-первых, Flipkart формирует большую часть контента товара на стороне клиента с помощью JavaScript, поэтому исходный HTML скудный и заполняется только после выполнения скриптов страницы. Во-вторых, Flipkart быстро обнаруживает автоматизированный трафик: IP дата-центров и паттерны запросов, не похожие на реальный браузер, получают задание или усечённую страницу ещё до полной загрузки описания товара.
Поэтому рабочий парсер Flipkart должен объединять в одном запросе две вещи: браузер, который действительно отрисовывает страницу, и IP, воспринимаемый платформой как реальный посетитель. Можно собрать такой стек самостоятельно с помощью headless-браузера и пула ротирующих резидентных прокси, но склеивать их вместе и поддерживать в рабочем состоянии, это большая часть работы. Crawling API объединяет оба компонента в одном вызове: вы отправляете URL с JavaScript-токеном, API отрисовывает страницу за доверенным IP и возвращает готовый HTML для парсинга.
Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; JavaScript (JS) токен сначала отрисовывает страницу в реальном браузере. Flipkart активно использует отрисовку на стороне клиента для детальной информации о товарах, поэтому JS-токен является здесь безопасным вариантом по умолчанию. Обычный токен может вернуть более скудную страницу, на которой отсутствуют цена, рейтинг или характеристики, и парсить из этого будет нечего.
Требования
Перед написанием кода необходимо подготовить несколько вещей. Это займёт немного времени.
Базовые знания Python. Вы должны уметь писать и запускать скрипты на Python, а также устанавливать пакеты через pip. Если вы новичок в языке, официальная документация Python и любой вводный курс охватывают уровень, предполагаемый данным руководством.
Python 3.8 или новее. Проверьте свою версию командой python --version. Если Python не установлен, загрузите его с python.org или через дистрибутив, например Anaconda.
Аккаунт Crawlbase и JS-токен. Зарегистрируйтесь, откройте дашборд и скопируйте свой JavaScript (JS) токен. Относитесь к токену как к паролю: он аутентифицирует ваши запросы, поэтому не храните его в системе контроля версий.
Настройка проекта
Создайте виртуальное окружение, чтобы зависимости проекта оставались изолированными, затем установите две библиотеки, необходимые парсеру.
python --version python -m venv flipkart_env source flipkart_env/bin/activate pip install crawlbase beautifulsoup4
В Windows активируйте окружение командой flipkart_env\Scripts\activate вместо строки source. Две зависимости выполняют работу: crawlbase, официальный клиент для Crawling API, а beautifulsoup4 парсит возвращённый HTML, позволяя извлекать отдельные поля по CSS-селектору. Если BeautifulSoup для вас нова, руководство по BeautifulSoup охватывает основы, на которые опирается данное руководство.
Шаг 1: получение отрисованной страницы товара
Начните с получения готовой страницы. Импортируйте класс CrawlingAPI, инициализируйте его с помощью JS-токена и запросите URL товара. Проверка кода статуса перед парсингом позволяет обнаруживать ошибки явно, а не молча.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("utf-8") print(f"Request failed: {response['status_code']}") return None if __name__ == "__main__": page_url = "https://www.flipkart.com/oneplus-bullets-wireless-z2-bluetooth-headset/p/itm4c3852314bb61" html = crawl(page_url) print(html[:500] if html else "No HTML returned")
Два параметра ожидания важны для клиентского ресурса вроде этого. ajax_wait указывает API ждать завершения загрузки асинхронного контента, а page_wait делает паузу на фиксированное количество миллисекунд после загрузки, чтобы элементы с поздней отрисовкой появились до захвата страницы. Пять секунд, разумная начальная точка; увеличьте, если поля товара возвращаются пустыми. Запустите скрипт командой python scraper.py и вы должны увидеть реальную разметку товара, а не скудную оболочку. Это подтверждает работоспособность отрисовки, прежде чем вы напишете хоть один селектор.
Flipkart требует отрисованной страницы за доверенным IP в одном вызове. Crawling API принимает JS-токен, запускает страницу в реальном браузере, ротирует резидентные IP на стороне сервера и передаёт вам готовый HTML, избавляя от необходимости самостоятельно запускать headless-парк и пул прокси. Начните с бесплатного тарифа на публичной странице товара.
Шаг 2: парсинг полей товара с помощью BeautifulSoup
Получив отрисованный HTML, загрузите его в BeautifulSoup и извлеките каждое поле по его селектору. Страница товара Flipkart имеет предсказуемую структуру, поэтому можно сопоставить название, цену, рейтинг, количество отзывов и список характеристик с отдельными селекторами. Оберните извлечение в вспомогательные функции, возвращающие None при отсутствии поля, чтобы одно отсутствующее значение не прервало весь процесс.
from bs4 import BeautifulSoup import re def text_of(soup, selector): el = soup.select_one(selector) return el.get_text(strip=True) if el else None def scrape_product(html): soup = BeautifulSoup(html, "html.parser") price = text_of(soup, "div._30jeq3.x_zBx4") highlights = [ li.get_text(strip=True) for li in soup.select("div._7eSDEz li._21Ahn-") ] return { "name": text_of(soup, "span.B_NuCI"), "price": re.sub(r"\D", "", price) if price else None, "rating": text_of(soup, "div._3LWZlK"), "review_count": text_of(soup, "span._2_R_DZ"), "highlights": highlights, }
Вспомогательная функция text_of одновременно выполняет два полезных действия: запрашивает один элемент и возвращает None, если он отсутствует, вместо того чтобы выбрасывать исключение при вызове .get_text() на пустом значении. Это делает извлечение устойчивым при отсутствии поля на данной странице, что встречается часто, поскольку не каждый товар имеет рейтинг или полный блок характеристик. Цена обрабатывается небольшим регулярным выражением для удаления символа валюты и запятых, оставляя чистую строку целого числа, которое можно привести к числу позднее.
Имена классов Flipkart (хешированные токены вроде _30jeq3, B_NuCI и _3LWZlK), это артефакты сборки, и они меняются без предупреждения. Относитесь к приведённым выше селекторам как к начальному шаблону, а не к контракту. Если поле возвращает None, проверьте живую страницу в инструментах разработчика браузера и обновите селектор. Периодическое обслуживание селекторов, это норма для любого производственного парсера, а не признак неисправности.
Шаг 3: сборка воедино
Теперь соедините получение и парсинг в один запускаемый скрипт. Получите отрисованный HTML, передайте его парсеру и выведите структурированную запись.
import json import re from crawlbase import CrawlingAPI from bs4 import BeautifulSoup api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"}) def crawl(page_url): options = {"ajax_wait": "true", "page_wait": 5000} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("utf-8") print(f"Request failed: {response['status_code']}") return None def text_of(soup, selector): el = soup.select_one(selector) return el.get_text(strip=True) if el else None def scrape_product(html): soup = BeautifulSoup(html, "html.parser") price = text_of(soup, "div._30jeq3.x_zBx4") highlights = [ li.get_text(strip=True) for li in soup.select("div._7eSDEz li._21Ahn-") ] return { "name": text_of(soup, "span.B_NuCI"), "price": re.sub(r"\D", "", price) if price else None, "rating": text_of(soup, "div._3LWZlK"), "review_count": text_of(soup, "span._2_R_DZ"), "highlights": highlights, } def main(): page_url = "https://www.flipkart.com/oneplus-bullets-wireless-z2-bluetooth-headset/p/itm4c3852314bb61" html = crawl(page_url) if not html: return data = scrape_product(html) print(json.dumps(data, indent=2)) if __name__ == "__main__": main()
Как выглядят результаты
Запустите полный скрипт командой python scraper.py и получите чистую структурированную запись товара, готовую для записи в JSON, CSV или базу данных.
{ "name": "OnePlus Bullets Wireless Z2 Bluetooth Headset", "price": "1799", "rating": "4.3", "review_count": "9,05,873 Ratings & 47,210 Reviews", "highlights": [ "30 Hrs Battery Life", "Fast Charge: 10 min for 20 hours", "Bluetooth version: 5.0" ] }
Масштабирование на множество товаров
Один товар, это демонстрация; реальная задача охватывает список товаров. Структура остаётся той же: составьте список URL товаров, получайте каждый через Crawling API, парсите той же функцией и собирайте строки. Поскольку все страницы товаров имеют одинаковую структуру, уже написанный парсер работает со всеми ними без изменений.
import time product_urls = [ "https://www.flipkart.com/oneplus-bullets-wireless-z2-bluetooth-headset/p/itm4c3852314bb61", "https://www.flipkart.com/boat-airdopes-161-bluetooth-headset/p/itm8a7493150ae4a", ] results = [] for url in product_urls: html = crawl(url) if html: results.append(scrape_product(html)) time.sleep(2) with open("products.json", "w") as f: json.dump(results, f, indent=2)
Чтобы создать список URL в масштабе, парсите публичные страницы поиска Flipkart тем же паттерном получение-парсинг, собирайте ссылки на товары, а затем посещайте каждую из них. Намеренная пауза time.sleep(2) между запросами задаёт темп: она не даёт перегружать сайт в плотном цикле, что является самым быстрым способом получить ограничение скорости. Более широкий план по электронной коммерции описан в статье парсинг в электронной коммерции.
Как оставаться незаблокированным
Даже при обработке отрисовки Flipkart отслеживает трафик, характерный для парсеров. Несколько привычек помогают поддерживать работоспособность парсера и применимы к любому жёсткому коммерческому ресурсу.
- Задавайте темп запросов. Непрерывная нагрузка на страницы в плотном цикле, самый быстрый способ получить ограничение скорости. Распределяйте запросы и меняйте цели вместо обхода одного пути на полной скорости.
- Опирайтесь на ротацию. Пул резидентных IP распределяет запросы по множеству реальных пользовательских адресов, чтобы ни один из них не активировал ограничение частоты. Crawling API берёт это на себя; если вы создаёте собственный стек, именно это место стоит сделать правильно.
- Читайте коды статусов. Запуск, при котором начинают возвращаться задания или ошибки, сигнализирует о том, что текущая частота или уровень IP уже недостаточны. Относитесь к этому как к сигналу снизить нагрузку, а не как к шуму, который нужно игнорировать.
Более широкий план описан в статьях как парсить сайты без блокировок и подробном руководстве как обходить JavaScript-сайты. Если вы предпочитаете маршрутизировать собственный трафик через ротирующий пул вместо использования управляемого API, Smart AI Proxy (также называемый AI Proxy) обеспечивает ту же ротацию резидентных IP как прокси-эндпоинт.
Законно ли парсить Flipkart?
Допустимость парсинга Flipkart зависит от условий использования Flipkart, вашей юрисдикции и того, что вы делаете с данными. Условия Flipkart ограничивают автоматизированный доступ, поэтому парсинг может нарушать эти условия независимо от тщательности вашего подхода. Ни один из приведённых здесь кодов этого не меняет, он лишь обеспечивает техническую работоспособность. Ознакомьтесь с Условиями использования Flipkart и его robots.txt и относитесь к обоим как к границам того, что можно собирать.
Несколько правил, которых стоит придерживаться. Собирайте только публичные данные товаров: название, цену, рейтинг, количество отзывов и характеристики, видимые любому пользователю без учётной записи. Соблюдайте заявленные ожидания Flipkart по частоте запросов и поддерживайте объём запросов достаточно низким, чтобы не перегружать серверы. Избегайте всего, что связано с идентифицируемыми лицами, включая профили рецензентов или данные покупателей, кроме совокупных публично отображаемых данных. Если вы планируете повторно использовать данные в коммерческих целях, получите разрешение или официальное соглашение, а не считайте, что молчание означает согласие.
Это руководство намеренно ограничено публичными страницами товаров, поскольку именно это позволяет сохранить работу обоснованной. Оно не охватывает ничего за авторизационной стеной: вашу учётную запись или историю заказов, дашборды продавцов, страницы с ограниченным доступом или любые попытки обойти аутентификацию. Если ваш проект требует больше, чем публичные данные товаров, для массового или коммерческого использования правильный путь, официальный API Flipkart или соглашение о данных, а не более умный парсер. Только публичные данные товаров.
Ключевые выводы
- Flipkart отрисовывает детали товаров на стороне клиента. Обычный запрос возвращает скудную страницу, поэтому необходимо выполнить отрисовку перед парсингом.
-
Вам нужны отрисовка и доверенный IP вместе. Crawling API с JS-токеном делает оба в одном вызове;
ajax_waitиpage_waitконтролируют время ожидания контента. - BeautifulSoup выполняет извлечение. Сопоставьте название, цену, рейтинг, количество отзывов и характеристики с актуальными селекторами и учитывайте возможное изменение этих хешированных имён классов.
- Масштабируйтесь через цикл по URL. Тот же парсер работает для каждой страницы товара, поэтому реальная задача, это просто список ссылок с разумным темпом запросов.
- Оставайтесь в рамках публичных данных. Соблюдайте Условия использования Flipkart и robots.txt, предпочитайте официальный API или соглашение для массового или коммерческого использования и никогда не трогайте учётные записи, заказы или страницы с ограниченным доступом.
Часто задаваемые вопросы
Почему обычный запрос не возвращает данные о товаре с Flipkart?
Потому что Flipkart формирует большую часть деталей товара на стороне клиента с помощью JavaScript. Исходный HTML скудный и заполняется только после выполнения скриптов страницы в браузере, поэтому прямой HTTP-запрос может вернуть страницу без цены, рейтинга или характеристик. Чтобы получить реальные данные, необходимо сначала отрисовать страницу, именно это обеспечивает JS-токен Crawling API.
Нужен ли мне обычный токен или JS-токен для Flipkart?
Используйте JS-токен. Обычный токен получает статический HTML, который в случае Flipkart может быть более скудной страницей без ключевых полей товара. JS-токен отрисовывает страницу в реальном браузере перед возвратом HTML, поэтому название, цена, рейтинг и характеристики присутствуют при парсинге BeautifulSoup.
Мои селекторы возвращают None. Что изменилось?
Почти наверняка разметка Flipkart. Его имена классов, это хешированные артефакты сборки, например _30jeq3 и B_NuCI, и они меняются без предупреждения, поэтому селекторы, работавшие в прошлом месяце, могут перестать работать. Проверьте живую страницу товара в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов, это норма для любого производственного парсера.
Как парсить несколько товаров Flipkart одновременно?
Составьте список URL товаров и пройдитесь по нему, получая каждый через Crawling API и парся той же функцией. Сначала составьте этот список, парся публичные страницы поиска Flipkart. Добавьте короткую задержку между запросами, чтобы не перегружать сайт, и в конце запишите собранные строки в JSON или CSV.
Что лучше, официальный API Flipkart или парсинг сайта?
Если вам нужны лицензированные данные, большой объём, гарантированная структура или права на коммерческое использование, официальный API или соглашение о данных, правильный инструмент, который держит вас в рамках условий Flipkart. Парсинг публичных страниц товаров подходом из этого руководства подходит для небольших публичных исследований данных, когда доступ к API не настроен, при условии соблюдения Условий использования, robots.txt и ограничений частоты.
Как избежать блокировки при парсинге Flipkart?
Поддерживайте низкую частоту запросов с каждого IP, меняйте цели вместо цикла по одному пути и маршрутизируйте через ротирующие резидентные IP, чтобы ни один адрес не активировал ограничение частоты. Crawling API управляет ротацией и пулом доверенных IP за вас; если вы создаёте собственный стек, именно это место стоит инвестировать. Следите за кодами статусов и снижайте нагрузку, когда начнёте получать задания.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
