Comments 44
This publication could cause conflicting feelings. Be critical of any posted information. Remember the Community Guidelines before posting your comment.
How to write and what to do?
- Don`t write offensive comments or get personal.
- Refrain from obscene language and toxic behavior, even in a veiled form.
- o report comments that violate the rules of the site, click the "Complain" button or fill out the feedback form.
What to do if: karma goes down, the account is blocked.
Для парсинга страниц html есть специальные инструменты для многих языков (в том числе и для питона). Они позволяют отправиться к нужной области и получать нужные значения. Ко всему будут корректно прочитаны спец символы.
Т.е. большую часть вашего кода можно было заменить парой циклов и вызовов.
Помимо этого, большую часть проблем с доступом к сайту и странице можно было решить эмулятором браузера (например, селениум)
В итоге алгоритм такой:
1. Подключаем нужные модули селениума
2. Переходим по странице и получаем её содержимое (включая то, что будет подгружено скриптами)
3. Скармливаем всю страницу парсеру
4. Переходим к нужной области указав актуальный xpath
5. Идём по циклу и забираем готовые значения
На всё это, в худшем случае уйдёт около 40 строк
Пример парсера: BeautifulSoup (пакет называется bs4
)
Использовать эмуляторы браузеров такая себе идея для парсинга, только если api совсем никакого нет. Ибо это все очень долго.
Ещё можно вносить записи не в эксель, а в базу данных, и получать нужные группировки для визуализации через SQL запросы
Вместо двумерных массивов прямо-таки напрашиваются таблицы, так что смело можно использовать pandas и орудовать датафреймами. Ну и если уж заниматься анализом данных, то, помимо pandas, также пригодятся библиотеки numpy, scikit-learn, matplotlib, seaborn и т.д. А лучше сразу поставить Anaconda, там уже всё это есть, и графики прямо там (в Jupyter Notebook) можно строить.
Девтулз- Нетворк, смотрим запросы, курл - на основную таблицу - греп айдишники, курл в цикле по айдишникам, сложить в SQL. Grafana - и крутить графики как хотите. И вообще не нужно выполнять скрипты со стороны клиента
Я попробую понять, что вы написали
Chrome -> Devtools -> Network - это место, где можно посмотреть все запросы на сайте, куда они идут, с какими параметрами, какие данные приходят в ответе.
cURL - это утилита для запросов из консоли, в devtools/network можно нажать правой кнопкой на запросе и скопировать его как cURL для вызова из консоли (ну или любым другим инструментом поддерживающим cURL или вызов консольных команд, ака, питон).
grep - утилита поиска по данным, можно использовать с результатом любой другой командой (cURL, например).
В Grafana можно скормить таблицу из БД и получить желаемые графики.
Все начинающие почему-то бегут кодить, ух вы все дураки а я вот щаз (это не камень в огород автора, он молодец, а констатация факта)..
Программист, это не про кнопки жмакать, а про достичь решения минимальными усилиями и быстро. И вот погружать страницу и выполнять J's с нее, тут точно не требуется.
Ну это как раз правильно - бежать кодить, будучи начинающим. Конечно если есть какой-нибудь наставник или какой-то пример, чтобы ориентироваться на него, то это куда полезнее. Но в любом случае сначала надо ручками все прочувствовать. Тот же говнокод начинаешь видеть только после того, как сам наговнокодил и через день вернулся что-то доделать))
Я лишь недавно начал программировать, и мне было интересно решить задачу, используя понятные мне инструменты на практике, что я и сделал. Не потому, что самый умный, а очень даже наоборот:)
Понятно, что есть условно электромясорубка, которая при должной настройке проблему перемелет и это будет в итоге проще. Но зачем тогда в школе учат считать, если калькулятор умеет это делать лучше и быстрее?
Спасибо за комментарии и проявленный интерес. Правда из первого я не понял приблизительно ничего. Он в духе «х*як, потом ещё х*як и вот так-то вот», субъективно для меня на данном этапе, по крайней мере.
Программист, это не про кнопки жмакать, а про достичь решения минимальными усилиями и быстро.
Вот как раз это у автора прекрасно получилось.
Получилось что?
Достичь практически значимого результата с минимальными затратами усилий. Данные получены? Графики построены? Какая разница, что там внутри, если цель была: спарсить один конкретный сайт и визуализировать полученные данные?
Про минимальные усилия, я бы поспорил.
Результат получен - да, я про это написал выше и автора похвалил.
Какая разница, что внутри - после такого и появляются одностраничники, которые жрут по 2-3 гб памяти и проц в 100%
Одностраничники на 2-3 Гб появляются, когда выбирают неправильный инструмент и неверно определяют цели. Поясню свою мысль: У автора статьи не было цели сделать универсальный супербыстрый аналитический инструмент с возможностью его развития и поддержки группой разработчиков (да поправит меня автор). Мы говорим про код, который пишется один раз для запуска 10 раз на одной конкретной машине. Если у меня на даче упала береза, я возьму топор и порублю её за несколько часов, а не буду учиться и сдавать на права на работу со спецтехникой, которая позволит мне поднять это бревно за пять минут не напрягаясь. Знать про существование бензопилы полезно, но если под рукой только топор, то почему бы и нет?
Так и здесь решение не оптимальное. Тащить выполнение J's который загрузит по урлу файл, когда можно просто глянуть какие запросы идут и без всего огорода просто скачать файл. В вашем примере, это нанять для березы дровосека, вместо использования топора.
Тащить выполнение J's который загрузит по урлу файл, когда можно просто глянуть какие запросы идут и без всего огорода просто скачать файл
Если действительно есть возможность вытянуть файл без рендера страницы - это замечательно. Я логически понимал, что такая возможность должна быть, что откуда-то он данные тянет и поймать бы их. Но в силу своей неосведомлённости я так и не смог понять, как это сделать, поэтому сделал то, что нашёл по своим запросам в гугл, что и описал, в общем-то:)
Насчёт оптимизации - согласен полностью, сам сторонник осмысленного использования ресурсов компьютера, просто ещё многому предстоит научиться.
В вашем примере, это нанять для березы дровосека, вместо использования топора.
Не совсем. В моем примере это скорее попросить у соседа бензопилу, которую я в глаза не видел и убить пару дней на её освоение. И еще желательно не сломать её при этом. Подход правильный, если цель: "освоить новый инструмент" или "срубить еще 5-10 берез за выходные". Нанять дровосека, в данном случае, это найти фрилансера, который всё сделает.
Не поправлю, составы комиссий не сильно часто меняются и делать полноценную программу с возможностью настройки и поддержкой у меня цели действительно не было. Тем не менее результат получился, работает чётко, возможности подстроить программу оставил, все ключевые моменты закомментил, так что вы правы.
Вообще-то была ещё претензия на аналитику данных, но вместо неё мы получаем "ну... тут и так всё понятно". Кому понятно, что, где, как? Данные собрал и тут же слил их в сортир личного ангажированного мировоззрения. Я негодую!
Можно как-то повежливее?
Я специально закрепил комментарий, по какой причине не опубликован вывод. И раз уж взялись и не ангажированы, то какие выводы вы делаете из этих данных? Я проверял свою гипотезу и она подтвердилась на 200%, но если у вас есть другие - прошу. Можно в личку, если тянет на политсрач.
Очень интересно, но мало что понятно. Я так понимаю, что автор скрыл некоторые выводы, т.к. боялся их публиковать, но именно эти выводы я и хотел бы почитать.
В оригинале статьи были и мои выводы об этом, и причина, почему они сюда не попали, не в страхе. Я вам их в лс отправлю, рад, что поинтересовались!
это лучше вам обратиться к эстонским программистам. у них там крутой опыт по разработке электронного голосования и причем там все это работает как часы
О, родной Питер. Был я на выборах 21 года членом УИК от Вишневского, того самого, которому едросня клонов плодила. Ну, что сказать, когда я на подсчёте голосов в последний день обнаружил на пакете с билютенями за 1 день голосования следы кустарной перепайки пакета, на меня сначала начали орать председатель УИК, она же директрисса, и её подруги, тоже местные. Потом приехали мусора (да, сотрудники полиции, которые участвуют в фальсификации выборов, могут называться только мусорами), забрали вещдок - перепаянный пакет, и увезли меня в отделение, за то что умный такой. Потом был суд для отмены результата на участке, пакет, естественно "потерялся", на отснятых видео "судья" ничего не увидела. Так что тут всё и без анализа понятно.
Это история о том, как я писал код на Python 3, который собирает и систематизирует данные по избирательным комиссиям в моём родном городе Санкт-Петербурге.
Эта история напомнила мне о том как проходила подготовка к аналогичным мероприятиях в 90-ые годы прошлого столетия. С точки зрения IT-индустрии и IT-технологий, это были тяжелейшие годы, компьютеров и принтеров не просто не хватало, во многих местах их просто не было.
Речь тогда шла о подготовке ваучеризации.
30 лет назад 1 октября 1992 года во всех отделениях Сбербанка РФ г. Химки стали выдавать ваучеры.
Чтение файлов лучше через yield сделать, фиг его знает какого размера файл на вход придет.
Это Вам еще повезло, что русские буквы текстом, а не с использованием специальных шрифтов со схожим начертанием, и разные для разных страниц, как было на сайте центризбиркома во время выборов... https://habr.com/ru/post/579492/
А тут описаны неплохие инструменты https://habr.com/ru/post/588989/
Когда начинал программировать, тоже писал такие простыни. Успешный проект по результату это хорошо.
Небольшие советы:
Если имя занято то можно добавить подчёркивание в конце, будет легече читать. und -> and_
Для filter_keywords
посмотрите втроенные функции all и any
Для analysis
помотрите на collections.Counter
, и по втроенным в Питон объектам есть неплохое видео на английском https://www.youtube.com/watch?v=lyDLAutA88s
В analysis
переменная counter это сумма всех значений, его проще посчитать один раз в конце counter = sum(result.values()). Если для каждого случая нужно поменять две переменных, то есть место для ошибки.filter_or
это же и есть filter_keywords
с and_=False, когда есть похожие функции то их стоит поместить рядом и подумать нельзя ли их объединить. В данном случае можно и обсолютно бесплатно.
Для визуализиции я сейчас играюсь с streamlit, это "умный принт" который выводит ваши результаты на html страницу. Туда можно как данные вывести так и графики. Красиво из коробки печатает pandas.DataFrame. https://streamlit.io/
Начинающий программист vs Избирком СПб