Создаём трекер цен Amazon на Python (правильным способом)
Собираем работающий трекер цен на Python и Selenium с реальными тестами того, что вас блокирует.
Ключевые выводы
- Страницы товаров редко блокируют скрейперы; в тестировании 150 запросов прошли без единого блока.
- Страницы поиска Amazon блокируют на самом первом запросе, даже с прокси.
- Блокировка касается того, что вы не реальный браузер, больше чем вашего IP-адреса.
- Прокси с привязкой по стране нужен для правильного локального ценообразования, а не только чтобы избежать блоков.
Я думал, что нашёл самую дешёвую PlayStation 5 в интернете.
Мой трекер вывел 74,00 $ рядом с PS5, но если в интернете что-то звучит слишком хорошо, чтобы быть правдой, это почти всегда так и есть. Эти 74,00 $ — это не консоль. Скрейпер схватил неправильный элемент, и это ровно такой молчаливый баг, который делает большинство уроков про «Amazon price tracker» тихо бесполезными.
Поэтому вместо того чтобы просто выложить пятьдесят строк Python и объявить это готовым — как делают почти все гайды — я нормально протестировал этот инструмент. Я запустил его против Amazon в большом объёме, измерил в точности, что блокируется и что нет, и исправил баги, о которых в уроках не упоминают. Результаты оказались по-настоящему удивительными: голый скрейпер вбил 150 запросов на страницу товара без единого блока, но упал на самом первом запросе к странице поиска.
Этот гайд — это работающий трекер плюс всё, что вскрыло тестирование, в том числе трюк Selenium, который полезно знать даже если вы уже строили скрейперы: он управляет реальным окном Chrome, визуально, так что вы видите загрузку страницы и скрейпинг в реальном времени.
Amazon вас вообще заблокирует?
Каждый урок предупреждает, что Amazon моментально заблокирует ваш скрейпер. Так что я протестировал, и результаты меня по-настоящему озадачили.
Я направил голый, без наворотов скрейпер на страницу товара PlayStation 5 и просто дал ему молотить. Один запрос, два, десять, пятьдесят, я ждал стены. Её не было. Этот скрейпер выбросил 150 запросов на одну и ту же страницу, и все вернулись «ok». Я не верил, как это открыто.
Так и было. Страницы товаров, выяснилось, почти не возражают. Потом я направил тот же скрейпер на страницу результатов поиска, и он упал на самом первом запросе. Не на десятом, не на пятидесятом. На первом. 503 сразу же.
Сбор данных происходит на страницах результатов поиска, поэтому именно там Amazon держит оборону. Отдельные страницы товаров? Открыты нараспашку.
Вот что я пробовал и что произошло:
Страница товара, голый скрейпер: 150 запросов, ноль блоков
Страница поиска, голый скрейпер: блокировка на запросе #1 (503)
Страница поиска, лучшие заголовки: всё ещё блокировка на запросе #1
Страница поиска, заголовки + резидентный прокси: всё ещё блокировка на запросе #1
Страница поиска, реальный браузер: сработало, 16 результатов
Страница поиска, браузер + прокси США: сработало, 22 результата
Больше всего меня удивило вот что: добавление резидентного прокси к странице поиска не помогло вообще. Всё ещё блокировка, первый запрос. Блокировка была не из-за моего IP-адреса, а из-за того, что я не был реальным браузером. В момент, когда я открыл ту же страницу поиска в настоящем браузере вместо сырого скрипта, оно сработало:
Собираем трекер
Давайте это соберём. Весь трекер — это примерно 50 строк Python. Вам нужны Python 3 и Google Chrome, потом одна команда для библиотек:
pip install selenium requests matplotlib
Указываем товар
Каждый товар Amazon имеет ID, называемый ASIN — это 10-значный код в URL сразу после /dp/. Например, в amazon.com/dp/B0F1J12R6N ASIN это B0F1J12R6N. Это всё, что нужно трекеру, чтобы найти товар.
Почему requests недостаточно
Очевидный способ скрейпить страницу — это библиотека requests в Python: одна строка, забрали HTML, готово. И для страницы товара это даже вернёт 200 OK. Но вот ловушка, в которую я попал: 200 не означает, что вы получили данные. Amazon строит цену на странице с помощью JavaScript, а requests не запускает JavaScript. Так что вы получаете страницу, но цены в ней нет.
Поэтому этот трекер использует Selenium. Selenium управляет реальным браузером Chrome: он действительно открывает страницу, запускает JavaScript и позволяет вам прочитать полностью отрендеренный результат. Первый раз, когда вы его запустите, Chrome откроется с баннером «Chrome контролируется автоматизированным тестовым ПО», и вы будете смотреть, как он работает в реальном времени.
Скрейпим цену (и баг, который отправляют все)
Здесь большинство уроков молча ломаются. Обычный подход берёт элемент .a-price и читает его текст. Проблема: Amazon помещает цену в этот элемент дважды — один раз видимо, один раз для читателей экрана, поэтому вы получаете смешанные 449,00 $449,00 $ вместо чистого числа.
Решение — нацелиться на чистую, единственную копию цены в боксе покупки и прочитать её внимательно, проверив сначала основную цену в боксе покупки, чтобы не схватить случайно цену аксессуара, что ровно то, как я получил ту «PS5 за 74,00 $». Точные селекторы есть в коде на GitHub.
Как только селектор попадает в правильный элемент, цена приходит чистой:
Сохраняем историю и строим график
Трекер цен полезен только если он помнит. Скрипт сохраняет каждое значение в файл, с ключом по товару, сохраняя цену как реальное число плюс его валюта, а не как строку «54,00 $». Это имеет значение: числа вы можете строить на графике, сравнивать и искать минимум; строки — нет. Оставленный в покое, скрипт проверяет один раз и останавливается; добавьте опцию цикла, и он перепроверяет по расписанию, строя историю со временем, которую второй маленький скрипт превращает в график цены во времени.
Баг, который чуть не стоил мне всего: вы можете скрейпить не ту страну
Помните ту PlayStation за 74,00 $? Это был первый знак того, что что-то не так. Второй был хуже, потому что его было сложнее заметить.
Когда я первый раз запустил трекер без прокси, Amazon не только дал мне странные цены, для некоторых товаров он вообще не давал реальную цену, только уведомление «этот товар невозможно доставить в ваше местоположение». Трекеру было нечего записывать.
Так что я направил его через прокси, чтобы выглядеть как американский покупатель. Цена вернулась в евро. Сначала я подумал, что прокси вообще не сработал. Потом я заметил, что на странице было написано «Доставка в Ирландию», и всё встало на место: прокси сработал отлично, он просто кинул меня на ирландский IP. Правильная идея, неправильная страна.
Решение — резидентный прокси, привязанный к стране, которая вам действительно нужна. Как только я закрепил свой в США, трекер вытащил правильную цену, 54,00 $, в долларах, каждый раз.
И эта привязка по стране — это не просто красивое дополнение, это весь смысл. Скажем, вы отслеживаете цены конкурентов, чтобы решить, что назначить на данном рынке. Эти числа имеют смысл только если это цены, которые этот рынок действительно видит. Один и тот же товар может стоить 449 $ в США и 499 € в Ирландии. Если ваш скрейпер молча возвращает ирландскую цену, вы принимаете решения для одного рынка на основе данных другого рынка, и потому что это выглядит правильно, никто это не замечает.
Поэтому прокси здесь — это не о пробивании блоков, моё тестирование показало, что страницы товаров почти не блокируют. Это о том, чтобы убедиться, что данные, которые вы собираете, — это правильные данные.
Если вам нужны данные цен привязанные к конкретной стране, резидентные прокси FlashProxy позволяют нацелиться на любое местоположение, поэтому вы всегда собираете цены, которые этот рынок действительно видит.
Так… это должно было быть сложнее?
Вот мой честный вывод: если вам когда-нибудь нужно скрейпить цены со странички, вам не нужно читать сотню блогов, смотреть кучу видео на YouTube или всё время доставать ИИ, пока он наконец это не поймёт. Вы можете просто это сделать. Это чрезвычайно легко, и честно говоря, немного настораживает, насколько это легко.
До того как я начал, я предполагал, что это будет сложно. Я был по-настоящему нервен, запуская ранние тесты без подключённого прокси, я думал, что меня заблокируют навсегда или задушат ограничением запросов. Я ожидал последствий.
Ничего не произошло. Буквально ничего. 150 запросов к странице товара, без прокси, без блоков, без бана, без злого письма. Стена, для которой я готовился, в основном там не была, и в том месте, где она была (страницы поиска), реальный браузер прошёл прямо через неё.
Так что если единственное, что вас останавливает от создания одного из этих инструментов — это предположение, что это сложно или рискованно: это не так. Собирайте. Просто держите это разумно, отслеживайте публичные цены, не молотьте сайт, и уважайте их условия. Но страх? Большей частью в вашей голове, как и в моей.
Полный код
Полный проект, трекер, помощник прокси, графики и тестовые скрипты — это открытый исходный код: amazon-price-tracker-python на GitHub. Клонируйте и запустите, или прочитайте в точности как это работает.


