Выходить за рамки
Пиу-пиу! Пишу по горячим следам! Только что я избежал эпичного провала. А началось всё как обычно - с мини-задачи. Следите за ходом событий.
Обычно когда надо что-то соскрапать в интернете - идут ко мне, так сложилось исторически. Я уже, наверно, соскрапал половину интернета и сейчас приступаю ко второй. Обычно всё просто: pip install requests beautifulsoup4
, хуяк-хуяк - и в прод.
Но есть сайты, которые все такие динамичные, у них всё через javascript подгружается, и просто так из них данные не вытащить - нужно смотреть, какие запросы к какому API делаются, и повторять их. На худой конец - есть headless браузеры, которые полностью мимикрируют под обычные браузеры, реально отрисовывают веб-страницы.
И в этот раз мне попался именно такой сайт - в исходниках только обфусцированный javascript, а данные вообще передаются бинарными чанками по вебсокетам. Ладно, пошёл разбираться. Обнаружил, что бинарные данные - это protobuf. Написал скрипт, чтобы он подключился по вебсокету к серверу, скачал все чанки и закинул на диск, а потом при помощи protoc --decode_raw < chunk1.bin
начал реверс-инжинирить, что же там внутри сообщений...
Я как посмотрел на это, так понял, что вторник не задался. Это щас всё парсить, чистить, декодировать...
Когда случается хрень вроде этой, я ищу способы, как можно её не делать.
Начал смотреть, где хостится приложение, и нашёл: оказывается, это простой скрипт на python, который превратили в веб-приложение при помощи streamlit.io. И даже любезно приложили ссылку на github репозиторий со скриптом. Как я её сразу не увидел - не знаю, наверно, у меня лишняя хромосома образовалась.
Пошёл в репозиторий, посмотрел, как работает скрипт, и увидел, что он просто берёт публичные данные из WanDB, и чтобы делать так же, нужен только ключ API. Пошёл на wandb.ai, зарегистрировался забесплатно, получил API ключ, и через 2 (ДВЕ!) минуты у меня были все данные. И при этом никаких вебсокетов, протобуфов и прочей прелести.
Какая мораль из всей этой истории? Не будьте дебилами как я Если вам говорят "вытащи данные из этой страницы" - это, внезапно, не значит, что вам нужно вытащить данные из этой страницы. Старайтесь расширить область поиска, увидеть более общий план, выйти за рамки.
Такое вот, будничное.
Кстати, я уже писал про это в своей самой короткой статье: Чем хороший программист отличается от плохого, или почему нужно выходить за рамки